Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Thread beenden und auf ihn warten (https://www.delphipraxis.net/59475-thread-beenden-und-auf-ihn-warten.html)

Brainstalker 22. Dez 2005 23:33


Thread beenden und auf ihn warten
 
Ich hab nichts passendes im Forum gefunden, also mache ich einen Thread auf.

Wenn mein Programm beendet wird, hagelt es einiges an Fehlern. Das liegt daran, dass ein Thread in meinem Programm läuft, der nicht korrekt beendet wird. Also beende ich den Thread kurz bevor ich das Programm beende. Es kann allerdings dann noch ein bisschen dauern bis der Thread beendet ist, weil die letzte Aktion noch zuende ausgeführt wird.
Delphi-Quellcode:
procedure TForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  exitcode: cardinal;
begin
  // Thread beenden
  if Thd <> nil then begin
    GetExitCodeThread(Thd.Handle, exitcode);
    if exitcode = STILL_ACTIVE then
      Thd.Terminate;
  end;
  .
  .
  .
end;
Thd ist das Threadobjekt.

So ich hab mir überlegt ich pack einfach ein Thd.WaitFor; rein. Das Problem ist dann kommt es auch zu einem Fehler, denn wenn er versucht auf das Thread-Objekt zuzugreifen, ist es nicht mehr vorhanden.

Wird das Programm beendet, wird der Thread beendet.
Problem 1 (ohne WaitFor): Das Programm wird "zu schnell" beendet und der Thread arbeitet noch -> Fehler
Problem 2 (mit WaitFor): WaitFor wird aufgerufen, aber Thread-Objekt anscheinend nicht mehr da -> Fehler

Jetzt such ich nach einer Lösung, vielleicht bin ich im Moment zu übermüdet, aber ich bekomms einfach nicht hin. Wenn mein Programm beendet wird, soll einfach nur der Thread beendet und gewartet werden bis er beendet ist.

jenbru 23. Dez 2005 07:06

Re: Thread beenden und auf ihn warten
 
Guten Morgen,

ich mach das immer so:

Delphi-Quellcode:
...
const
 TIMEOUT = 200; //ms
...

//Thread zur Terminierung auffordern
Thrd.Terminate;
while (True) do
  begin
  //Thread benachrichtigen und warten
  WaitResult:= WaitForSingleObject(Thrd.Handle,TIMEOUT);
  if WaitResult = WAIT_FAILED  then
    RaiseLastOSError;
  //Thread signalisiert -> Ausgang
  if WaitResult = WAIT_OBJECT_0 then
    break;
  //Application.ProcessMessages;
end;
Thrd.Free;

Wenn man im Hauptthread wartet muss man sicherstellen, dass dieser nicht lange blockiert. Deshalb packe ich das WaitForSingleObject in eine Schleife und warte immer nur kurz. Wenn der Thread benachrichtigt wurde wird die Schleife verlassen. Damit das Ganze funktioniert, muss man sicherstellen, dass das Thread-Handle auch nach Terminierung noch gueltig
bleibt. Dazu gibt man bei Erzeugung des Threads folgendes an:

Delphi-Quellcode:
Thrd.FreeOnTerminate:= False;
Damit man nicht ewig wartet (falls der Thread in irgendeiner Form in einen Deadlock gelaufen ist), sollte man als Abbruchkriterium
für die Warteschleife vielleicht noch eine maximale Wartezeit vorgeben.

Hoffe ich konnte weiterhelfen.
Schoenen Gruß,
Jens

Brainstalker 24. Dez 2005 00:45

Re: Thread beenden und auf ihn warten
 
Herzlich Willkommen in der DP. :party: :balloon:

Danke für deinen Tipp, den werd ich mal ausprobieren. Scheint genau das zu sein was ich gesucht habe. Werde wie gesagt die Whileschleife anpassen. Ich dnke zwar nicht, das der Thread in ein Deadlock gerät, aber für alles gibt es ein erstes mal. Und wenn dann ne Endlosschleife auftritt ist das auch nicht so spannend.

Thx und Mfg Brainstalker

Walter Landwehr 11. Mär 2017 17:10

AW: Thread beenden und auf ihn warten
 
Was ist WaitResult

Zacherl 11. Mär 2017 19:09

AW: Thread beenden und auf ihn warten
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1363881)
Was ist WaitResult

Welcher Datentyp? Oder was die Werte im einzelnen bedeuten? Schau mal in die Dokumentation von MSDN-Library durchsuchenWaitForSingleObject, da solltest du alles finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:54 Uhr.

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