Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Threads create/terminate (https://www.delphipraxis.net/183186-threads-create-terminate.html)

baumina 18. Dez 2014 11:28

Threads create/terminate
 
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?

himitsu 18. Dez 2014 11:36

AW: Threads create/terminate
 
Zitat:

Zitat von baumina (Beitrag 1283873)
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. :angel2:


Zitat:

Zitat von baumina (Beitrag 1283873)
Muss die Variable AFTPThread wirklich im Formular deklariert sein?

Wenn die Form Zugriff auf den Thread haben will, dann ja. :stupid:

baumina 18. Dez 2014 11:45

AW: Threads create/terminate
 
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?

BUG 19. Dez 2014 11:19

AW: Threads create/terminate
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 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 by Thomas Breitkreuz