![]() |
Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
Moin Tom,
Zitat:
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". |
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 |
Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
Zitat:
Delphi-Quellcode:
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:
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} |
Re: trotz WaitFor wird nicht gewartet bis Thread beendet ist
Ich stimme dem KingIR völlig zu
Delphi-Quellcode:
ist der Teil durch den ein Subthread durchläuft
else WaitForSingleObject(H[0], INFINITE)
|
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; |
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. |
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