Przetwarzanie zadań w watku

0

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;
1
AdamCe1987 napisał(a):

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 ?

Raczej tak, ale to zależy...
Opis jest tak enigmatyczny, że tak, nie, może będzie poprawną odpowiedzią.

Do przechowywania danych i wymiany miedzy watkami używam "TThreadList"

Może być, ale w kodzie tego zupełnie nie widać poza deklaracją zmiennej tego typu...

Nie wymyslam koła na nowo ?

Raczej nie.

Mozje jest w standardowej biblotece jakis taki mechanizm ?

O tak, oczywiście.
Standardowa biblioteka to PPL
http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_the_Parallel_Programming_Library

Albo w OmniThreadLibrary coś jest tylko nie wiem jak użyć ?

OTL ma znacznie więcej możliwości, ale jest trudniejsza do opanowania.
Poczytaj:
https://www.thedelphigeek.com/search/label/practical-otl

Jest jeszcze AsyncCalls (już ciut leciwe) no i standardowe TThread.
Da się to zrobić na czymkolwiek.

Kod moze sie nie skompilowac bo 100% z palca

TODO:

  • zrobić powiadomoenie aby glowny watek wiedzial kiedy dane zadanie sie policzy

To zwykła synchronizacja wątków jest...

  • zablokować tworzenie instancji TWatek , jedyny mozliwy dostep to "class procedure DodajZadanie"

Można, ale... po co?
Imo, lepiej zamiast TWatek (bosz, co za pro-nazewnictwo...) zrobić sobie IWatek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1