Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OnTerminate wird nicht ausgeführt (https://www.delphipraxis.net/138696-onterminate-wird-nicht-ausgefuehrt.html)

GreenHorn3600 15. Aug 2009 14:52


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:
procedure TWUSUpdatesCheck.OnFinishedDownload(Sender: TObject);
begin
  {Hier die Daten übernehmen}
   writeln('finished');
  fThreadRunning := false;
  FreeAndNIL(fWUSDownloadThread);
end;
Danke schon mal.
Greeny

xZise 15. Aug 2009 15:04

Re: OnTerminate wird nicht ausgeführt
 
Hallo Greeny,
was macht er denn in TWUSDownloadThread.Execute?

MfG
xZise

GreenHorn3600 15. Aug 2009 15:13

Re: OnTerminate wird nicht ausgeführt
 
Hallo Fabian,

nichts besonderes, er ruft den Download auf und macht eine Fehlerbehandlung.

Delphi-Quellcode:
procedure TWUSDownloadThread.Execute;
begin
  try
    if (fURL <> '') and (FFilename <> '') then Download;
  except
    if not(ExceptObject is EAbort) then
      Synchronize(self, ShowException);
  end;
end;
Der Download sieht folgendermaßen aus:
Delphi-Quellcode:
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;
Wobei das Flag HasDownloaded wunderbar auf True gesetzt ist, und Terminate aufgerufen wird.

Weiss wirklich nicht, an was es liegen könnt... :gruebel:

Greeny

Apollonius 15. Aug 2009 15:22

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.

GreenHorn3600 15. Aug 2009 15:30

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:
procedure TWUSUpdatesCheck.OnFinishedDownload(Sender: TObject);
begin
 {Hier die Daten übernehmen}
   writeln('finished');
  fThreadRunning := false;
  fWUSDownloadThread.WaitFor;
  FreeAndNIL(fWUSDownloadThread);
end;
Dies sollte doch jetzt genügen, oder?

Grüße
Greeny

Apollonius 15. Aug 2009 15:33

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.

GreenHorn3600 15. Aug 2009 15:35

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

Apollonius 15. Aug 2009 15:40

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.

GreenHorn3600 15. Aug 2009 15:49

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

alzaimar 15. Aug 2009 18:09

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 +2. Es ist jetzt 05:05 Uhr.
Seite 1 von 2  1 2   

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