Einzelnen Beitrag anzeigen

Benutzerbild von KingIR
KingIR

Registriert seit: 19. Feb 2006
81 Beiträge
 
Delphi 2006 Professional
 
#13

Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist

  Alt 4. Jul 2006, 15:47
Zitat von Christian Seehase:
...
WaitFor wartet u.a. darauf, dass Terminated = true ist.
Dies ist nach Verlassen der While-Schleife der Fall, so dass WaitFor nichts mehr hat, auf dass es warten muss.
Sicher? Sieht mir in der Classes.pas nicht so aus:
Delphi-Quellcode:
function TThread.WaitFor: LongWord;
{$IFDEF MSWINDOWS}
var
  H: array[0..1] of THandle;
  WaitResult: Cardinal;
  Msg: TMsg;
begin
  H[0] := FHandle;
  if GetCurrentThreadID = MainThreadID then
  begin
    WaitResult := 0;
    H[1] := SyncEvent;
    repeat
      { This prevents a potential deadlock if the background thread
        does a SendMessage to the foreground thread }

      if WaitResult = WAIT_OBJECT_0 + 2 then
        PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
      WaitResult := MsgWaitForMultipleObjects(2, H, False, 1000, QS_SENDMESSAGE);
      CheckThreadError(WaitResult <> WAIT_FAILED);
      if WaitResult = WAIT_OBJECT_0 + 1 then
        CheckSynchronize;
    until WaitResult = WAIT_OBJECT_0;
  end else WaitForSingleObject(H[0], INFINITE);
  CheckThreadError(GetExitCodeThread(H[0], Result));
end;
{$ENDIF}
WaitFor wartet bis der Thread beendet ist (d.h. .Execute komplett abgearbeitet ist). Das kann (und sollte) bei gesetztem Terminated-Flag natürlich vorzeitig passieren, hat aber direkt nichts mit WaitFor zu tun, soweit ich das sehe. Im vorliegenden Fall ist die .Execute-Methode ja erst fertig, nachdem Close abgeschlossen wurde.
  Mit Zitat antworten Zitat