Einzelnen Beitrag anzeigen

MicAlter

Registriert seit: 29. Aug 2007
12 Beiträge
 
#3

Re: WaitForMultipleObjects funktioniert irgendwie nicht

  Alt 20. Apr 2010, 13:31
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...
  Mit Zitat antworten Zitat