Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi trotz WaitFor wird nicht gewartet bis Thread beendet ist (https://www.delphipraxis.net/72641-trotz-waitfor-wird-nicht-gewartet-bis-thread-beendet-ist.html)

Christian Seehase 4. Jul 2006 15:36

Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
 
Moin Tom,

Zitat:

Zitat von TomDooley
Das heisst aber das ich Terminate und WaitFor gar nicht mehr verwende...

Wieso?
Du sollst ja nur für die While-Schleife eine andere Abbruchbedinung finden.
Danach wird Close Durchlaufen.

Anschliessend kann dann Terminated auf True gesetzt werden, bzw. wird die Execute-Methode dann ja beendet.
In Beiden Fällen sollte dann ja WaitFor "zuschlagen".

DerDan 4. Jul 2006 15:46

Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
 
Hallo,



ich hab grad mal in Classes.pas nachgesehen und wenn ich es richtig interpretiere hat

WaitFor

nichts mit dem Terminate / Terminated zu tun, sondern kehrt zurück sobald der Thread beendet ist.

Also sollte deine Geschichte eigendlich funktionieren!

.Terminate setzt nur das Flag Terminated, dass du ja richtig als Abbruch auswertest.


Welche Version von Delphi hast du denn? bzw hast du den Quelltextg von Classes.pas?

mfg

DerDan

KingIR 4. Jul 2006 15:47

Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
 
Zitat:

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. :cyclops:

DerDan 4. Jul 2006 15:49

Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
 
Ich stimme dem KingIR völlig zu


Delphi-Quellcode:
else WaitForSingleObject(H[0], INFINITE)
ist der Teil durch den ein Subthread durchläuft

TomDooley 4. Jul 2006 16:08

Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
 
Ich arbeite mit Delphi 5:
Delphi-Quellcode:
function TThread.WaitFor: LongWord;
var
  Msg: TMsg;
  H: THandle;
begin
  H := FHandle;
  if GetCurrentThreadID = MainThreadID then
    while MsgWaitForMultipleObjects(1, H, False, INFINITE,
      QS_SENDMESSAGE) = WAIT_OBJECT_0 + 1 do PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE)
  else WaitForSingleObject(H, INFINITE);
  GetExitCodeThread(H, Result);
end;

TomDooley 5. Jul 2006 12:28

Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
 
:wiejetzt: jetzt bin ich ein wenig verwirrt... Müsste meine Version jetzt doch funktionieren? Was mache ich dann trotzdem falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz