Użytkownik w głównym wątku wybiera plik pliki oraz co z nimi zrobić (wygenerować AVI/MP4 albo sekwencje BMP)
I dodaje do jakiegoś watka w tle który liczy dane
Czy taki wstępny zarys koncepcji będzie OK ?
Do przechowywania danych i wymiany miedzy watkami używam "TThreadList"
Nie wymyslam koła na nowo ?
Mozje jest w standardowej biblotece jakis taki mechanizm ?
Albo w OmniThreadLibrary coś jest tylko nie wiem jak użyć ?
Kod moze sie nie skompilowac bo 100% z palca
TODO:
- zrobić powiadomoenie aby glowny watek wiedzial kiedy dane zadanie sie policzy
- zablokować tworzenie instancji TWatek , jedyny mozliwy dostep to "class procedure DodajZadanie"
TCoZrobic = (generujAVI,generujMP4,generujBMP)
TZadanie = record
nazwa_pliku: string;
co_zrobic: TCoZrobic
end;
TWatek = class(TTHread)
ile_zriobiono: integer;// ile zadan juz zrobiono
lista: TThreadList; // lista zadań
protected
procedure execute
public
class procedure DodajZadanie(p_zadania: TZadanie )
constructor .... // twórz obiekt lista: TThreadList
end;
procedure TWatek.Execute
var
v_lista: Tlist;
v_zadanie: TZadanie ;
v_jestZadanie:boolean;
begin
freeonterminate := true;
while not terminated do
begin
v_jestZadanie := false;
try
v_lista := a_lista.LockList;
if ile_zribiono < v_lista .count then
begin
// aby szybko obblokowac liste kopiuje zadanie do lokalnej zmiennej
v_jestZadanie := true;
v_zadanie := v_lista [ile_zribiono]
end
else
begin
sleep(100)
end;
finally
a_lista.UnlockList;
end;
if v_jestZadanie then
begin
GenerujDane(v_zadanie );
inc(ile_zribiono);
end;
end;
end;
var
tmpWatek : TWatek;
class procedure TWatek.DodajZadanie(p_zadania: TZadanie )
var
v_lista: Tlist;
begin
if tmpWatek = nil then tmpWatek.create(false);
try
v_lista := tmpWatek.a_lista.LockList;
v_lista.add(p_zadania);
finally
a_lista.UnlockList;
end;
end;