AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Threads create/terminate

Ein Thema von baumina · begonnen am 18. Dez 2014 · letzter Beitrag vom 19. Dez 2014
Antwort Antwort
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#1

Threads create/terminate

  Alt 18. Dez 2014, 10:28
Das mit den Threads hab ich noch nicht so drauf und Google mich schon seit ner Weile im Ringel rum. Für euch ist das sicherlich ne ganz einfache Geschichte, mir fehlt hier grad das Verständnis.

Was ich habe:
Wenn in einer Grid gescrollt wird, wird mithilfe eines Threads eine Datei via FTP-Download auf die Festplatte gespeichert und mit einem TWebBrowser angezeigt.

Wie ich es umgesetzt habe:
Im GridOnClick wird ein Thread kreiert:
Delphi-Quellcode:
  AFTPThread := TFTPThread.Create(Dateiname,
                                  DoFTPOnLoading,
                                  DoFTPOnComplete);
Im DoFTPOnLoading ist eine Fortschrittsanzeige, im DoFTPOnComplete mache ich das WebBrowser.Navigate. Beide Proceduren werden per Synchronize aufgerufen.

Früher hatte ich die Fortschrittsanzeige und das Navigate im Thread, was ja nicht richtig war, da nicht threadsave. Deswegen habe ich die Anzeige nun in den Hauptthread verlagert. Dadurch kann ich jetzt FreeOnTerminate auf True setzen ohne dass ich Zugriffsverletzungen bekomme *jubel. Dadurch kann ich nun auch auf diese Zeilen, die ich bislang x-mal im Code hatte verzichten:

Delphi-Quellcode:
  if Assigned(AFTPThread) then
  begin
    AFTPThread.Terminate;
    AFTPThread.WaitFor;
    FreeAndNil(AFTPThread);
  end;
Prima! Nun zu meinen Fragen:

Wann muss ich denn jetzt was genau tun? Vor dem TFTPThread.Create muss ich sicherlich ein
Delphi-Quellcode:
if Assigned(AFTPThread) then
  begin
    AFTPThread.Terminate;
  end;
machen. Oder ein FreeAndNil? Ein FreeOnTerminate macht mir meine Variable ja nicht Nil, stimmt das Assigned dann überhaupt? Muss ich was abbrechen/freigeben, wenn das Formular geschlossen wird? Muss die Variable AFTPThread wirklich im Formular deklariert sein?
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.371 Beiträge
 
Delphi 12 Athens
 
#2

AW: Threads create/terminate

  Alt 18. Dez 2014, 10:36
Ein FreeOnTerminate macht mir meine Variable ja nicht Nil, stimmt das Assigned dann überhaupt?
Natürlich nicht.

Entweder der Thread gibt sich selber frei und äußere Variablen sind potentiell ungültig.

Oder man gibt den Thread nur von außen Frei.

Oder der Thread setzt die Variable auf nil, wenn er sich selber freigibt.


Muss die Variable AFTPThread wirklich im Formular deklariert sein?
Wenn die Form Zugriff auf den Thread haben will, dann ja.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Threads create/terminate

  Alt 18. Dez 2014, 10:45
Schade, hab mich wohl mal wieder komplett ungeschickt ausgedrückt.

Delphi-Quellcode:
procedure TfmDok.grid_dokClick(Sender: TObject);
begin
  // durch select in der DB erhalte ich Dateiname
  // AFTPThread wird ausschließlich hier drin verwendet, ist aber im Moment eine Variable von TfmDok wegen? :
  // hier vorherigen Thread terminate/free???
  AFTPThread := TFTPThread.Create(Dateiname,
                                  DoFTPOnLoading,
                                  DoFTPOnComplete);

end;
Brauche ich ein
Delphi-Quellcode:
procedure TfmDok.OnDestroy;
begin
  AFTPThread.Terminate;
end;
?

Sollte ich FreeOnTerminate wieder auf False setzen?
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

AW: Threads create/terminate

  Alt 19. Dez 2014, 10:19
OnTerminate wird im Kontext des Mainthreads augeführt, von dort aus sollte man also problemlos AFTPThread auf nil setzen können oder das anderweitig behandeln.
  Mit Zitat antworten Zitat
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 08:15 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