Ich habe mir schon fast gedacht, dass du da noch mal nachfragst. Mach mal eine neue Konsolenanwendung und dann kopierst du das mal da rein:
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE}
uses
Windows;
var
hEvents: array[0..2] of THandle;
function WorkingThread(p: Pointer): Integer;
var
i: Integer;
begin
for i := 0 to 9 do
begin
writeln(i);
sleep(1500);
SetEvent(hEvents[0]);
end;
SetEvent(hEvents[1]);
result := 0;
end;
function WatchThread(p: Pointer): Integer;
var
bRunning: Boolean;
ThreadID: Cardinal;
wfmo: DWORD;
begin
bRunning := True;
CloseHandle(BeginThread(nil, 0, @WorkingThread, nil, 0, ThreadID));
while bRunning do
begin
wfmo := WaitForMultipleObjects(length(hEvents)-1, @hEvents[0], False, INFINITE);
if (wfmo - WAIT_OBJECT_0) = 0 then
begin
writeln('OK');
SetEvent(hEvents[2]);
end
else
begin
writeln('Finish');
bRunning := False;
end;
end;
result := 0;
end;
var
ThreadID: Cardinal;
begin
hEvents[0] := CreateEvent(nil, False, False, 'Work');
hEvents[1] := CreateEvent(nil, False, False, 'Finish');
hEvents[2] := CreateEvent(nil, False, False, 'Continue');
CloseHandle(BeginThread(nil, 0, @WatchThread, nil, 0, ThreadID));
Readln;
end.
Nach jeder Ausgabe vom WorkingThread schreibt der WatchThread sein OK und zum Schluss, wenn der WorkingThread fertig ist eben "Finish". Das
sleep ist nur dazu da, damit man sieht, wie das abläuft.
So das ganze ist etwas komplex. Mal sehen, ob ich es verständlich erklären kann. Im Prinzip benachrichtigen sich die Threads gegeseitig. Der WorkingThread sagt mit
SetEvent(hEvents[0]);, dass eine Berechnung fertig ist. Der WatchThread wartet mit
wfmo := WaitForMultipleObjects(length(hEvents)-1, @hEvents[0], False, INFINITE); auf die Signalisierung eines Events aus dem Array. Ist es das nullte Event, schreibt es sein OK in die Konsole. Dann löst es selber ein Event aus auf das der WorkingThread mit
WaitForSingleObject(hEvents[2], INFINITE); wartet damit er weiter machen kann.
Im Endeffekt ist es auch eine CriticalSection - nur eben mit Benachrichtigung.