Hallo zusammen,
irgendwie funktioniert die SuFu nicht richtig... Suche nach "WaitForMultipleObjects" gibt kein Ergebnis zurück, obwohl ein solches Thema bereits
existiert.
Ist aber nicht ganz mein Thema:
Ich möchte mehrere Worker-Threads für eine Suchfunktion benutzen und auf deren Ende warten. Jeder Thread liefert mir ein Ergebnis zurück welches ich auswerten möchte. Dafür ist, denke ich zumindest, die Funktion WaitForMultipleObjects gedacht.
Hier mein Code:
Delphi-Quellcode:
TMyThread.
Constructor( nMaxLaufzeit : Integer; AMemo : TMemo );
begin
inherited Create( True );
FMaxLaufzeit := nMaxLaufzeit;
FMemo := AMemo;
FreeOnTerminate := True;
Resume;
end;
TMyThread.ShowThreadStatus;
begin
Memo.Lines.Add( Format('
Alive from thread %d, %d of %d',[self.Handle,FCurrent,FMaxLaufzeit]) );
end;
TMyThread.Execute;
begin
FCurrent := FMaxLaufzeit;
while not Terminated
do
begin
Sleep(1000);
Synchronize(ShowThreadStatus);
Dec( FCurrent );
if FCurrent < 1
then
Terminate;
end;
end;
const MAX = 5;
var
ThreadList :
array[0..MAX-1]
of TMyThread;
ThreadHandles :
array[0..MAX-1]
of THandle;
i,ThreadsRunning : Integer;
dw,idx : DWord;
//Threads erzeugen und Handle-Liste füllen
for i := 0
to MAX-1
do
begin
//Max. Laufzeit des Threads in Sekunden mitgeben
ThreadList[i] := TMyThread.Create( (i+1)*3 );
ThreadHandles[i] := ThreadList[i].Handle;
end;
ThreadsRunning := MAX;
while ThreadsRunning > 0
do
begin
//dw := WaitForMultipleObjects( MAX, @ThreadHandles, false, 0); //gleiches Ergebnis
dw := WaitForMultipleObjects( MAX, @ThreadHandles[0], false, 0);
if (dw <> WAIT_TIMEOUT)
AND
(dw <> WAIT_FAILED)
then
begin
//Array-Index des auslösenden Threads errechnen
idx := dw - WAIT_OBJECT_0;
if idx < MAX
then
begin
Memo.Lines.Add( Format('
Thread %d (Handle:%d) beendet.',[idx,ThreadHandles[idx]]) );
Dec( ThreadsRunning );
end;
end;
Application.ProcessMessages;
end;
Die Threads geben nun ihre Statusmeldungen korrekt aus. So weit so gut.
Nun erwarte ich, dass ich für
jeden Thread, der sich beendet ein "Signal" bekomme. Ist aber leider nicht so
Einmal bekomme ich ein "gültigen" Index (2), danach immer nur WAIT_FAILED?
Verstehe ich den Sinn der Funktion ncht richtig oder mache ich irgendwas falsch?
lg,
Michael