Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TThread abfragen, ob beendet (https://www.delphipraxis.net/69961-tthread-abfragen-ob-beendet.html)

Christian.Ossi 22. Mai 2006 23:21


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)

Christian.Ossi 23. Mai 2006 00:07

Re: TThread abfragen, ob beendet
 
genauer gefragt, was muss da genau in die OnClose bzw. OnCloseQuery rein?

Dani 23. Mai 2006 00:58

Re: TThread abfragen, ob beendet
 
Hi,

deine Threads könnten sich z.B. nach ihrem Durchlauf aus einer Liste von laufenden Threads (Delphi-Referenz durchsuchenTList) austragen. Du musst dann nur noch überprüfen, ob ThreadList.Count = 0.

turboPASCAL 23. Mai 2006 05:25

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:
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;
Der Nachteil wird sein das zB. beim Beenden von Windows dein Programm das herunterfahren verhindert.
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

Christian.Ossi 23. Mai 2006 07:01

Re: TThread abfragen, ob beendet
 
Danke :wink:


Ich bekommen jetzt aber komischerweise in dieser Zeile

Delphi-Quellcode:
While Not MyThread.Terminated Do Application.ProcessMessages;
den Fehler: "[Fehler] Toolboxfenster.pas(725): E2096 Methodenbezeichner erwartet"


und hier

Delphi-Quellcode:
MyThread.Terminate;
das: "[Fehler] Toolboxfenster.pas(732): E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt"

turboPASCAL 23. Mai 2006 07:40

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 ?

Christian.Ossi 23. Mai 2006 07:50

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;

ste_ett 23. Mai 2006 07:54

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:
  Name.Free;
oder

Delphi-Quellcode:
  Name.WaitFor;

// Irgendwas ggf. noch erledigen

  Name.Free;

Christian.Ossi 23. Mai 2006 08:09

Re: TThread abfragen, ob beendet
 
Irgendwas stimmt da nicht....

Er nimmt die Klassenbefehle wie Free oder Terminated oder Terminate nicht an

Muetze1 23. Mai 2006 08:12

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr.
Seite 1 von 2  1 2      

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