![]() |
TThread abfragen, ob beendet
Wie kann ich abfragen, ob ein Thread bereits am Ende ist oder noch läuft, falls er noch läuft soll das Beenden des Hauptprogrammes solange verzögert werden, bis Thread am Ende und dann alles erst beenden (sonst Zugriffsverletzung und Runtime-Error)
|
Re: TThread abfragen, ob beendet
genauer gefragt, was muss da genau in die OnClose bzw. OnCloseQuery rein?
|
Re: TThread abfragen, ob beendet
Hi,
deine Threads könnten sich z.B. nach ihrem Durchlauf aus einer Liste von laufenden Threads ( ![]() |
Re: TThread abfragen, ob beendet
Hi Christian,
In solch einem Fall würde ich entweder beim Beenden des Programms den Thread Beenden oder falls das nicht geht wiefolgt vorgehen:
Delphi-Quellcode:
Der Nachteil wird sein das zB. beim Beenden von Windows dein Programm das herunterfahren verhindert.
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := FALSE; {Form1.}Caption := 'Programm wird beendet, bitte warten...'; While not MyThread.Terminated do Application.ProcessMessages; CanClose := TRUE; end; Desswegen müsste man es noch erweitern:
Delphi-Quellcode:
type
//... private { Private-Deklarationen } procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION; public { Public-Deklarationen } end; //... procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession); begin MyThread.Terminate; Msg.Result := 1; // 1- beenden erlaubt / 0 - nicht erlaubt end; Gruss |
Re: TThread abfragen, ob beendet
Danke :wink:
Ich bekommen jetzt aber komischerweise in dieser Zeile
Delphi-Quellcode:
den Fehler: "[Fehler] Toolboxfenster.pas(725): E2096 Methodenbezeichner erwartet"
While Not MyThread.Terminated Do Application.ProcessMessages;
und hier
Delphi-Quellcode:
das: "[Fehler] Toolboxfenster.pas(732): E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt"
MyThread.Terminate;
|
Re: TThread abfragen, ob beendet
Lange Frage, kurze Antwort (oder anders rum). Kann ich nix zu sagen, da ich nicht weis was du in deinem Code machst bzw. vorhast. Was macht der Thread ?
|
Re: TThread abfragen, ob beendet
Delphi-Quellcode:
FTPUpload = Class(TThread)
Protected Procedure Execute; Override; Private HTTPSocket: TIdHTTP; FTPSocket: TIdFTP; Datei1: ShortString; Datei2: ShortString; Neu1: ShortString; Neu2: ShortString; Public Constructor Create(Const FDatei1,FNeu1,FDatei2,FNeu2: ShortString); Destructor Destroy; Override; End;
Delphi-Quellcode:
Constructor FTPUpload.Create(Const FDatei1,FNeu1,FDatei2,FNeu2: ShortString);
Begin HTTPSocket:=TIdHTTP.Create(Nil); FTPSocket:=TIdFTP.Create(Nil); Datei1:=FDatei1; Neu1:=FNeu; Datei2:=FDatei2; Neu2:=FNeu2; Inherited Create(False); End; Destructor FTPUpload.Destroy; Begin HTTPSocket.Free; FTPSocket.Free; Inherited; End;
Delphi-Quellcode:
Procedure FTPUpload.Execute;
Begin FreeOnTerminate:=True; FTPSocket.Username:=FTPACCESS.Strings[0]; FTPSocket.Password:=FTPACCESS.Strings[1]; FTPSocket.Host:=FTPACCESS.Strings[2]; FTPSocket.Connect; Try FTPSocket.Put(Datei1,Neu1,False); If Datei2 <> '' then FTPSocket.Put(Datei2,Neu2,False); Finally FTPSocket.Disconnect; End; End; DeleteFile(Datei1); If Datei2 <> '' then DeleteFile(Datei2); End; |
Re: TThread abfragen, ob beendet
Die Klasse TThread besitzt die Prozedur "WaitFor()". :)
Damit wartet der aufrufende Thread solang, bis der Thread der Instanz der TThread-Klasse beendet wurde. Diese Prozedur wird auch über den Destructor aufgerufen. Ein einfaches "NameDerKlasseninstanz.Free;" wartet, bis der Thread zu Ende ist und gibt dann Alles frei. Also im OnClose-Event deiner Form:
Delphi-Quellcode:
oder
Name.Free;
Delphi-Quellcode:
Name.WaitFor;
// Irgendwas ggf. noch erledigen Name.Free; |
Re: TThread abfragen, ob beendet
Irgendwas stimmt da nicht....
Er nimmt die Klassenbefehle wie Free oder Terminated oder Terminate nicht an |
Re: TThread abfragen, ob beendet
1. "Er nimmt die Klassenbefehle wie Free oder Terminated oder Terminate nicht an" - mit anderen Worten: Er kennt die Methoden nicht.
2. Dann scheint deine Element keine Klasse zu sein. Schau bitte mal nach, wo das Element deklariert worden ist und als was. |
Re: TThread abfragen, ob beendet
Thread-Klasse
Delphi-Quellcode:
Klassenbefehl der nicht funktioniert (Methodenbezeichner erwartet)
FTPUpload = Class(TThread)
Protected Procedure Execute; Override; Private HTTPSocket: TIdHTTP; FTPSocket: TIdFTP; Datei1: ShortString; Datei2: ShortString; Neu1: ShortString; Neu2: ShortString; Public Constructor Create(Const FDatei1,FNeu1,FDatei2,FNeu2: ShortString); Destructor Destroy; Override; End;
Delphi-Quellcode:
While Not FTPUpload.Terminated Do Application.ProcessMessages;
|
Re: TThread abfragen, ob beendet
FTPUpload heißt deine Klasse. Aber wie heißt die Objektvariable mit der Instanz der Klasse?
Delphi-Quellcode:
Normalerweise Bezeichnte man Klassen auch mit einem großen "T" am Anfang: TFTPUpload. Bei der Deklaration lässt man es dann einfach weg:
var
Upload: FTPUpload; begin Upload := FTPUplod.Create(...); While Not Upload.Terminated Do Application.ProcessMessages;
Delphi-Quellcode:
var
FTPUpload: TFTPUpload; |
Re: TThread abfragen, ob beendet
Natürlich - klar!
Ist ja beim Form genauso - mein Fehler sorry |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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