AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

OnTerminate wird nicht ausgeführt

Ein Thema von GreenHorn3600 · begonnen am 15. Aug 2009 · letzter Beitrag vom 16. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2   
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#1

OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 13:52
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
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#2

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 14:04
Hallo Greeny,
was macht er denn in TWUSDownloadThread.Execute?

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#3

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 14:13
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...

Greeny
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 14:22
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#5

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 14:30
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 14:33
Das gibt einen Deadlock: OnTerminate wird indirekt vom Thread selbst aufgerufen. Der Thread blebit zwangsläufig am Leben, bis OnTerminate zurückkehrt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#7

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 14:35
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 14:40
Gut, dass du das erwähnst. OnTerminate wird per Synchronize aufgerufen, was ohne spezielle Vorkehrungen bei Konsolenanwendungen nicht funktioniert.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#9

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 14:49
Tja, dann bringt mir das Event nicht wirklich was

Werde mich mal nach einer anderen Lösung umsehen.

Dank und Gruß
Greeny
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: OnTerminate wird nicht ausgeführt

  Alt 15. Aug 2009, 17:09
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf