Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#4

AW: TThreadList - So richtig?

  Alt 3. Dez 2011, 19:47
Ich würde anstatt das FWorkEvent-Handle als Semaphore erstellen.

Das Event hat hier den Nachteil, dass alle WorkerThreads losrennen, wenn das Event gesetzt wurde.
Ist die Anzahl der Jobs kleiner als die Anzahl der WorkerThreads, dann machen einige WorkerThreads eine sinnlose "Leerfahrt".

Bei einer Semaphore rennen nur so viele Threads los, wie nötig.

Du könntest Dir dazu ganz einfach 2 passende Methoden zum Hinzufügen von Jobs basteln.

Delphi-Quellcode:
procedure AddJob(const aJob:String);
begin
  CriticalSection.Enter;
  try
    JobList.add(aJob);
    ReleaseSemaphore(FWorkEvent,1,nil);
  finally
    CriticalSection.leave;
  end;
end;

end;

procedure AddJobList(const aLobList:TStringList);
  var i:integr;
begin
  if not assigned(aJobList) then exit;
  if not aJobList.Count = 0 then exit; // damit wir keine "0" Semaphore setzen >> gibt Exception

  CriticalSection.Enter;
  try
    for i:= 0 to aJoblist.Count -1 do
    begin
    JobList.add(aJobList[i]);
    end;
    ReleaseSemaphore(FWorkEvent,aJoblist.Count,nil);
  finally
    CriticalSection.leave;
  end;
end;
So stellt du sicher, dass der "Count" seiner Semaphore genau so groß ist wie die Anzahl Jobs in der Jobliste.
Da kein WorkerThread losläuft, wenn der Count der Semaphore = 0 ist hast du die "Leerfahrten" der übrigen WorkerThreads gespart...

Grüße
Jens
  Mit Zitat antworten Zitat