Zitat:
1. Hole Job aus der Liste
2. Frage, ob Startbedingung erfüllt sind
3. Warte auf Antwort
Wenn ich das richtig verstehe, dann soll also ein "WorkerThreadStarterThread" auf die Semaphore der Joblist reagieren und wenn alle Voraussetzungen passen, ein
Mutex oder eine Semaphore setzen, die dann den Workerthread startet.
Besser "warten auf erfüllte Voraussetzungen" anstatt Suspend ist vernünftig. Nehme ich
Ich versuche mal einen Weg ohne den zusätzlichen "StarterThread"....
Etwa so sollte das Thema ohne Suspend und zusätzliche Threads doch klappen oder?
Delphi-Quellcode:
WeakupHandles[0] := JobList.JobSemaphore;
WeakupHandles[1] := SuspendThreadsEvent.Handle;
WeakupHandles[2] := TerminateThreadsEvent.Handle;
case WaitForMultipleObjects(3, @WeakupHandles[0], False, INFINITE) of
WAIT_OBJECT_0 + 2: // "TerminateEvent gesetzt"
begin
WorkerThreadStatus := stOT_Terminating;
BeforeWorkerThreadTerminate;
Terminate;
Break;
end;
WAIT_OBJECT_0 + 1: // "SuspendWorkersEvent gesetzt"
begin
ResetStatus;
WorkerThreadStatus := stOT_Suspended;
"Flag setzen auf der der Thread am Ende von Execute reagiert";
Break;
end;
WAIT_OBJECT_0 + 0: // "neuer Job (Semaphore) vorhanden"
begin
WorkerThreadStatus := stOT_WaitingForPrerequisites;
hBedingungenErfuellt := CheckBedingunen(); // noch zu bauen
WeakupHandles[0] := JobList.JobSemaphore;
WeakupHandles[1] := SuspendThreadsEvent.Handle;
WeakupHandles[2] := hBedingungenErfuellt; // noch zu bauen
case WaitForMultipleObjects(3, @WeakupHandles[0], False, INFINITE) of
WAIT_OBJECT_0 + 2: // "TerminateEvent gesetzt"
begin
WorkerThreadStatus := stOT_Terminating;
BeforeWorkerThreadTerminate;
Terminate;
Break;
end;
WAIT_OBJECT_0 + 1: // "SuspendWorkersEvent gesetzt"
begin
ResetStatus;
WorkerThreadStatus := stOT_Suspended;
ReleaseSemaphore(JobList.JobSemaphore,1,nil); // Semaphore zurückgeben
"Flag setzen auf der der Thread am Ende von Execute reagiert";
Break;
end;
WAIT_OBJECT_0 // hBedigungnenErfuellt ist gesetzt
begin
WorkerThreadStatus := stOT_Working;
VerarbeiteJob(Joblist.GetNextJob);
break;
end;
end;
break;
end;
...