AGB  ·  Datenschutz  ·  Impressum  







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

Thread beenden

Ein Thema von Gambit · begonnen am 30. Apr 2005 · letzter Beitrag vom 30. Apr 2005
Antwort Antwort
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#1

Thread beenden

  Alt 30. Apr 2005, 13:42
Hallo,

ich habe hier folgenden Thread:

Delphi-Quellcode:
constructor TConnectThread.create(CreateSuspended: boolean; Connection: TZConnection);
begin
  inherited create(CreateSuspended);
  fErrCode:= -1;
  setThreadStatus(0);
  fCon:= Connection;
end;

procedure TConnectThread.Execute;
begin
  Try
    fCon.Connected:= true;
    fErrCode:= 0;
    terminate;
  except
    fErrCode:= 1;
    setThreadStatus(1);
    terminate;
  end;
  if Terminated then
  begin
    setThreadStatus(1);
    exit;
  end;
end;
Der Thread baut über fCon.Connected:= true eine Verbindung zu einer DB auf und giebt bei erfolgreichem Aufbau den Fehlercode 0 zurück. Bei einer Exception, also nicht erfolgreicher Aufbau soll Fehlercode 1 zurückgegeben werden. Die lokale Procedur setThreadStatus soll ein Byte setzen um mir anzugeben ob der Thread beendet wurde. Abfragen kann ich den Status über die public Funktion getThreadStatus.

Also der Thread funzt soweit. Aber ab und zu hakt es irgendwo und ich bekomme keine Verbindung zur Datenbank aber auch keine Exception. Normalerweise müsste irgendwann zumindest der Fehlercode 1 zurückgegeben werden wenn die Verbindung zur DB nicht klappt. Passiert aber nicht. Als wenn sich der Thread irgendwie aufgehängt hätte. Wie gesagt, das passiert nur ab und zu. Für diesen Fall wollte ich auf der Form, die angezeigt wird, wenn der Thread gestartet ist, einen Abbruchbutton machen, womit ich den Thread zwangsweise beenden kann.

das sieht so aus:

Delphi-Quellcode:
procedure TFormTransfer.BtnTerminateClick(Sender: TObject);
begin
  if assigned(Form1.MDBCon) then // MDBCon ist der Thread
  begin
    Form1.MDBCon.Terminate;
    showMessage('Threadstatus ist: '+intToStr(Form1.MDBCon.getThreadStaus));
    if assigned(Form1.MDBCon) then showMessage('Thread noch aktiv');
    Close;
    Form1.Enabled:= true;
  end;
end;
leider wird aber der Thread mit Form1.MDBCon.Terminate; nicht beendet, ich bekomme beim ersten showMessage den Status 0 und in der zweiten showMessage die Meldung "Thread noch aktiv".

Langer Rede, kuzer Sinn, was läuft hier falsch?

Gruß

Gambit
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Thread beenden

  Alt 30. Apr 2005, 13:45
Wenn der Thread in einer Endlosschleife steckt und Du ihn von außen nicht beenden kannst, kannst Du ihn via "Holzhammer-Methode" mit MSDN-Library durchsuchenTerminateThread abschießen.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#3

Re: Thread beenden

  Alt 30. Apr 2005, 13:58
hmmm, dafür bräuchte ich das handle des Threads? Wie bekomme ich das?
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Thread beenden

  Alt 30. Apr 2005, 14:35
Zitat von Gambit:
hmmm, dafür bräuchte ich das handle des Threads? Wie bekomme ich das?
Ein schneller Blick in die OH zeigt, dass TThread eine Eigenschaft mit dem Namen Handle hat.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#5

Re: Thread beenden

  Alt 30. Apr 2005, 14:44
danke,
ich habe gerade mal folgendes gemacht:

dort, wo ich im Programm je nach fErrCode fortfahre habe ich mal geprüft ob es das Threadobjekt nocht gibt

if assigned(MDBCon) then... und siehe da, es ist noch assigned. Sollte der Thread nicht nach der Ausführung beendet sein? FreeOnTerminate habe ich nach der Instanzierung aufgerufen also so:

Delphi-Quellcode:
MDBCon:= TConnectThread.Create(false, DB_DataModul.ZConDBMaster);
MDBCon.FreeOnTerminate:= true;
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Thread beenden

  Alt 30. Apr 2005, 15:01
Hallo,
nur weil der Thread terminiert bedeutet das noch lange nicht das MDBCon auf Nil gesetzt wird.
Lies dir mal in der OH unter Assigned nach
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#7

Re: Thread beenden

  Alt 30. Apr 2005, 15:15
nicht weil er terminiert wird sondern weil ich FreeOnTerminate auf true gesetzt habe meinte ich
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#8

Re: Thread beenden

  Alt 30. Apr 2005, 18:17
Also wenn dieses Hängen auftritt, bekomme ich einen Statuswert von 110, obwohl ich im Constructor den Status auf 0 setze. Komisch dass, oder?
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:53 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