![]() |
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:
Im DoFTPOnLoading ist eine Fortschrittsanzeige, im DoFTPOnComplete mache ich das WebBrowser.Navigate. Beide Proceduren werden per Synchronize aufgerufen.
AFTPThread := TFTPThread.Create(Dateiname,
DoFTPOnLoading, DoFTPOnComplete); 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:
Prima! Nun zu meinen Fragen:
if Assigned(AFTPThread) then
begin AFTPThread.Terminate; AFTPThread.WaitFor; FreeAndNil(AFTPThread); end; Wann muss ich denn jetzt was genau tun? Vor dem TFTPThread.Create muss ich sicherlich ein
Delphi-Quellcode:
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?
if Assigned(AFTPThread) then
begin AFTPThread.Terminate; end; |
AW: Threads create/terminate
Zitat:
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:
|
AW: Threads create/terminate
Schade, hab mich wohl mal wieder komplett ungeschickt ausgedrückt.
Delphi-Quellcode:
Brauche ich ein
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;
Delphi-Quellcode:
?
procedure TfmDok.OnDestroy;
begin AFTPThread.Terminate; end; Sollte ich FreeOnTerminate wieder auf False setzen? |
AW: Threads create/terminate
![]() |
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