Autor Téma: Delphi 10.4 - vlákno se mi bije s Generics.Collections.TList<>  (Přečteno 300 krát)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 360
  • Karma: 0
Vážená skupino,
narazil jsem na podivné chování Delphi 10.4 ve spojení s Generics.Collections.TList<>. Aplikace má samostatné vlákno ukládající každých 5 sekund nasbíraná data do souboru. Vše funguje bez problémů, resp. fungovalo. Teď aktualizuji starý kód na zpracování DXF výkresů a nově jsem použil TList<record> v domění, že si ušetřím práci oproti klasickým polím. TListy vytvářím (xxx := TList<record>.Create;), pak uvolňuji (xxx.Free), tak jak je to korektní. Důležité - TList nemá s ukládacím vláknem ABSOLUTNĚ NIC společného. Jakmile ale TListy použiji, vlákno v momentě ukládání vyhlásí chybu čtění paměti (ACCESS_VIOLATION). Chybu vyvolají vždy funkce v System na principu ReallocMem/SetLength při skládání stringů před jejich vysypáním do souboru.

Dotaz - Nesetkal se někdo s podobným problémem?

Když TList vykomentuji, tak vše funguje bez sebemenšího problému. Kód je správně, protože dělá co má. Asi to přepíši na klasická pole, protože TList je cca 3x pomalejší, navíc TList nelze ani rozumě debugovat.

Děkuji.


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3466
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Delphi 10.4 - vlákno se mi bije s Generics.Collections.TList<>
« Odpověď #1 kdy: 22-05-2024, 14:44:19 »
Tezko radit, pokud pristupujes z jineho vlakna, zamykas?
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 360
  • Karma: 0
Re:Delphi 10.4 - vlákno se mi bije s Generics.Collections.TList<>
« Odpověď #2 kdy: 22-05-2024, 15:06:36 »
Ano, mám Lock při zpracovávání dat před výstupem do souboru.

Napadlo mě vykomentovat kód inicializující vlákno a ošetřit jeho volané funkce. Tím jsem zajistil, že vlákno se ani nerozběhne a ověřil tak, že problém je v TList. Chyba ACCESS_VIOLATION chodí nadále, ale pouze v System.Generics.Collections části TListHelper (nějaká funkce na přidávání nových položek). Dál jsem to nezkoumal - přepisuji kód na klasická pole.
« Poslední změna: 22-05-2024, 15:14:55 od age.new »

Offline erik

  • Nováček
  • *
  • Příspěvků: 3
  • Karma: 0
    • Verze Delphi: Delphi 7 - Delphi 12
Re:Delphi 10.4 - vlákno se mi bije s Generics.Collections.TList<>
« Odpověď #3 kdy: 23-05-2024, 01:30:54 »
Skontroluj, ci je v projekte nastavene IsMultiThread:

https://docwiki.embarcadero.com/Libraries/Athens/en/System.IsMultiThread