![]() |
OnTerminate wird nicht ausgeführt
Hallo Wissende,
ich kämpfe grad mit Threads. Dabei versuche ich auf das Ende eines Threads zu reagieren, nur, das Ereignis wird nie ausgeführt. Weiss einer warum und was man hier machen muß damit es funktioniert? Danke schon mal. Hier der Start des threads:
Delphi-Quellcode:
procedure TWUSUpdatesCheck.Run;
begin if fTempFileName = '' then CreateTempFilename; if not CanRun then exit; //Nur wenn alle Parameter gefüllt sind if fThreadRunning then exit; //Nur ein Download kann laufen if fWUSDownloadThread <> NIL then Raise EWUSException.Create(rWUS_Exeption_Internal_Error); fWUSDownloadThread := TWUSDownloadThread.Create(true); fWUSDownloadThread.URL := fUpdateListURL; fWUSDownloadThread.Filename := fTempFileName; fWUSDownloadThread.OnTerminate := OnFinishedDownload; fWUSDownloadThread.FreeOnTerminate := false; fWUSDownloadThread.Resume; end; und hier kommt er nie an:
Delphi-Quellcode:
Danke schon mal.
procedure TWUSUpdatesCheck.OnFinishedDownload(Sender: TObject);
begin {Hier die Daten übernehmen} writeln('finished'); fThreadRunning := false; FreeAndNIL(fWUSDownloadThread); end; Greeny |
Re: OnTerminate wird nicht ausgeführt
Hallo Greeny,
was macht er denn in TWUSDownloadThread.Execute? MfG xZise |
Re: OnTerminate wird nicht ausgeführt
Hallo Fabian,
nichts besonderes, er ruft den Download auf und macht eine Fehlerbehandlung.
Delphi-Quellcode:
Der Download sieht folgendermaßen aus:
procedure TWUSDownloadThread.Execute;
begin try if (fURL <> '') and (FFilename <> '') then Download; except if not(ExceptObject is EAbort) then Synchronize(self, ShowException); end; end;
Delphi-Quellcode:
Wobei das Flag HasDownloaded wunderbar auf True gesetzt ist, und Terminate aufgerufen wird.
procedure TWUSDownloadThread.Download;
var URLDown: TDownLoadURL; begin URLDown := TDownLoadURL.Create(NIL); try URLDown.Filename := FFilename; URLDown.URL := FURL; URLDown.OnDownloadProgress := DownloadProgress; URLDown.ExecuteTarget(NIL); finally URLDown.Free; end; if fHasDownloaded then terminate; end; Weiss wirklich nicht, an was es liegen könnt... :gruebel: Greeny |
Re: OnTerminate wird nicht ausgeführt
Unabhängig davon, weshalb OnTerminate nicht aufgerufen wird, ist dein Event-Handler falsch. Du darfst den Thread dort nicht freigeben, weil er noch intern benötigt wird. Wenn du ihn tatsächlich direkt bei der Terminierung freigeben willst, kannst du auch FreeOnTerminate auf true setzen.
|
Re: OnTerminate wird nicht ausgeführt
Hallo Apollonius,
ich möchte aber die Instanz kontrollieren und es nicht dem Thread überlassen, wann er sich verabschieden möchte. Ich habe mal den Abschnitt wie folgt geändert:
Delphi-Quellcode:
Dies sollte doch jetzt genügen, oder?
procedure TWUSUpdatesCheck.OnFinishedDownload(Sender: TObject);
begin {Hier die Daten übernehmen} writeln('finished'); fThreadRunning := false; fWUSDownloadThread.WaitFor; FreeAndNIL(fWUSDownloadThread); end; Grüße Greeny |
Re: OnTerminate wird nicht ausgeführt
Das gibt einen Deadlock: OnTerminate wird indirekt vom Thread selbst aufgerufen. Der Thread blebit zwangsläufig am Leben, bis OnTerminate zurückkehrt.
|
Re: OnTerminate wird nicht ausgeführt
Es wäre schön, wenn OnTerminate aufgerufen würde. Aber das macht es ja nicht, von daher kann es ja auch keinen Deadlock geben.
Aber kann es sein, dass OnTerminate nur bei Fensterapplikationen und nicht bei Konsolapplikationen funktioniert? Grüße Greeny |
Re: OnTerminate wird nicht ausgeführt
Gut, dass du das erwähnst. :mrgreen: OnTerminate wird per Synchronize aufgerufen, was ohne spezielle Vorkehrungen bei Konsolenanwendungen nicht funktioniert.
|
Re: OnTerminate wird nicht ausgeführt
Tja, dann bringt mir das Event nicht wirklich was :-(
Werde mich mal nach einer anderen Lösung umsehen. Dank und Gruß Greeny |
Re: OnTerminate wird nicht ausgeführt
Setze FreeOnTerminate auf True, setze Terminated *nicht* auf True (überflüssig, weil die Execute-Methode eh terminiert) und schreibe die 'Download Fertig' Logik ans Ende der Execute-Methode.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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