Hallo sirius,
hmmm... ich war gerade dabei das Array zu verkürzen, als ich Deine Nachricht gelesen habe
Und funktioniert... danke.
Delphi-Quellcode:
var
ThreadHandles :
array of THandle;
...
SetLength(ThreadHandles,MAX);
...
ThreadsRunning := MAX;
while ThreadsRunning > 0
do
begin
dw := WaitForMultipleObjects( ThreadsRunning, @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 );
//Wenn nicht letztes Element signalisiert wurde, dann letztes Element dem Signalisiertem zuweisen
if idx <> ThreadsRunning
then
ThreadHandles[idx] := ThreadHandles[ThreadsRunning];
//Letztes Element abschneiden
SetLength(ThreadHandles,ThreadsRunning);
end;
end;
Application.ProcessMessages;
end;
Komisch finde ich, dass sich mein Thread gar nicht "richtig" meldet, wenn er aus dem Execute raus kommt. Ich bekomme das Signal nur, wenn ich am Ende explizit "TerminateThread" aufrufe -
Noch'n Fehler?
Delphi-Quellcode:
TMyThread.Execute;
begin
FCurrent := FMaxLaufzeit;
while not Terminated
do
begin
Sleep(1000);
Synchronize(ShowThreadStatus);
Dec( FCurrent );
if FCurrent < 1
then
Terminate;
end;
//Ansonsten wird das Thread-Ende nicht signalisiert!)
TerminateThread( self.Handle, 0 );
end;
Ich habe MsgWaitForMultipleObjects bereits mir diversen Events erfolgreich getestet. Hing halt bei der obigen Variante fest... gleich mal weiter tippen.
Und die "ref.dp200x" kannte ich noch gar nicht...