Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Definition Funktion um Threads zu befüllen

  Alt 22. Feb 2015, 08:04
Natürlich nur eine Skizze, trotzdem kann man verbessern:
Pseudocode:
Delphi-Quellcode:
// Workerthread
procedure TWorkerThread.Execute;
begin
...
      MyCriticalSection.Enter;
      try
        DoSomethingWith(List[0]);
        List.Delete(0);
      finally
        MyCriticalSection.Leave;
      end;
...
Hupsa: Solange ein Job ausgeführt wird, ist die Liste bzw. der Zugriff auf Selbige blockiert. besser so:
Delphi-Quellcode:
// Workerthread
procedure TWorkerThread.Execute;

  Function NextItemInList : ISomethingToDo;
  begin
    MyCriticalSection.Enter;
      try
        If List.Count>0 then begin
          Result := List[0];
          List.Delete(0);
        else Result := nil;
      finally
        MyCriticalSection.Leave;
      end;
  end;

begin
...
      DoSomethingWith(NextItemInList);
...
Jetzt ist nur das Extrahieren des ersten Elements der Jobliste exklusiv. 'DoSomethingWith' sollte nun noch prüfen, ob der übergebene Job <> nil ist.
Ich würde zudem noch eine Semaphore einführen und den Thread schlafen legen. Das 'AddItem' weckt ihn auf, indem die Semaphore per 'ReleaseSemaphore' um 1 erhöht wird. Damit rennt die Execute-Methode automatisch so lange, wie Jobs in der Liste sind.

Siehe auch:
http://www.delphipraxis.net/93835-wo...ntergrund.html

Geändert von Dejan Vu (22. Feb 2015 um 08:23 Uhr)
  Mit Zitat antworten Zitat