AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TThread abfragen, ob beendet

Ein Thema von Christian.Ossi · begonnen am 23. Mai 2006 · letzter Beitrag vom 23. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
Christian.Ossi

Registriert seit: 23. Mai 2004
Ort: Greußen
91 Beiträge
 
Delphi 2006 Architect
 
#1

TThread abfragen, ob beendet

  Alt 23. Mai 2006, 00:21
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 Rose
© Christian.Ossi
  Mit Zitat antworten Zitat
Christian.Ossi

Registriert seit: 23. Mai 2004
Ort: Greußen
91 Beiträge
 
Delphi 2006 Architect
 
#2

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 01:07
genauer gefragt, was muss da genau in die OnClose bzw. OnCloseQuery rein?
Christian Rose
© Christian.Ossi
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 01:58
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.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 06:25
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
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Christian.Ossi

Registriert seit: 23. Mai 2004
Ort: Greußen
91 Beiträge
 
Delphi 2006 Architect
 
#5

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 08:01
Danke


Ich bekommen jetzt aber komischerweise in dieser Zeile

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


und hier

MyThread.Terminate; das: "[Fehler] Toolboxfenster.pas(732): E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt"
Christian Rose
© Christian.Ossi
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#6

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 08:40
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 ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Christian.Ossi

Registriert seit: 23. Mai 2004
Ort: Greußen
91 Beiträge
 
Delphi 2006 Architect
 
#7

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 08:50
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;
Christian Rose
© Christian.Ossi
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#8

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 08:54
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:

  Name.Free; oder

Delphi-Quellcode:
  Name.WaitFor;

// Irgendwas ggf. noch erledigen

  Name.Free;
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Christian.Ossi

Registriert seit: 23. Mai 2004
Ort: Greußen
91 Beiträge
 
Delphi 2006 Architect
 
#9

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 09:09
Irgendwas stimmt da nicht....

Er nimmt die Klassenbefehle wie Free oder Terminated oder Terminate nicht an
Christian Rose
© Christian.Ossi
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: TThread abfragen, ob beendet

  Alt 23. Mai 2006, 09:12
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:48 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