Přepracoval jsem ukládání souborů a pomocí TFileStream jsem se dostal na výborné časy - cca 250MB dat za 1 sekundu. Ale i přesto bych rád celé ukládání spustil v threadu. Mám ale problém, jak si to vše uspořádat. V každé proceduře mám vlastní logování událostí (nazývám to Trace), které je samo o sobě vlákno starající se o správu logu (třídění, ukládání do soubor atd.). Zároveň mám důležité části kódů v try - except blocích, které v případě chyby předá zprávu do logování chyb, které je opět řízené ve vláknu. Obě vlákna se navzájem neovlivňují a pracují vedle sebe.
Důležitá poznámka - všechny procedury a funkce mám v různých unitech (globální), roztříděných podle toho co provádějí a s jakýmy daty pracují. Když si vytvořím vlákno (potomka TThread), tak si nejsem jistý, zda je "thread safe" volat procedury a funkce mimo třídu vlákna. Přepisovat do třídy vlákna, ležícího v jedné unitě, procedury a funkce ležící jinde by mi v tom udělalo chaos. Níže na příkladu uvedu, co mám na mysli:
// unit_1.pas
TMyThread = class(TThread)
// unit_2.pas
Data = array[0..9] of TData;
procedure Uloz_vsechna_data;
// unit_3.pas
procedure Vymaz_soubory(TData);
procedure Uloz_do_souboru(TData);
Průběh:
Procedure Uloz_vsechna_data:
- podmínka, zda běží vlákno TMyThread, pokud ano, přes Event jej nechám začít od začátku, pokud ne, spustím jej.
- ve vláknu TMyThread se spustí cyklus "for a := 0 to length(Data) - 1" a v každém cyklu:
1) Vymaz_soubory(Data[a])
2) Uloz_do_souboru(Data[a])
Obě procedury Vymaz_soubory a Uloz_do_souboru obsahují množství Trace a try-except bloků a obě procedury mohu volat kdykoliv jindy i mimo proceduru Uloz_vsechna_data, tj. například na stisk tlačítko zavolám jen proceduru Vymaz_soubory(Data[a]). Samozřejmě si ohlídám, abych vláknu nezměnil data (nevymazal soubory) při jeho činnosti.
Je to tak v pořádku?
Děkuji.