![]() |
Thread beenden
Hallo,
ich habe hier folgenden Thread:
Delphi-Quellcode:
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.
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; 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:
leider wird aber der Thread mit
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;
Delphi-Quellcode:
nicht beendet, ich bekomme beim ersten showMessage den Status 0 und in der zweiten showMessage die Meldung "Thread noch aktiv".
Form1.MDBCon.Terminate;
Langer Rede, kuzer Sinn, was läuft hier falsch? Gruß Gambit |
Re: Thread beenden
Wenn der Thread in einer Endlosschleife steckt und Du ihn von außen nicht beenden kannst, kannst Du ihn via "Holzhammer-Methode" mit
![]() mfG mirage228 |
Re: Thread beenden
hmmm, dafür bräuchte ich das handle des Threads? Wie bekomme ich das?
|
Re: Thread beenden
Zitat:
|
Re: Thread beenden
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
Delphi-Quellcode:
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:
if assigned(MDBCon) then...
Delphi-Quellcode:
MDBCon:= TConnectThread.Create(false, DB_DataModul.ZConDBMaster);
MDBCon.FreeOnTerminate:= true; |
Re: Thread beenden
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 |
Re: Thread beenden
nicht weil er terminiert wird sondern weil ich FreeOnTerminate auf true gesetzt habe meinte ich
|
Re: Thread beenden
Also wenn dieses Hängen auftritt, bekomme ich einen Statuswert von 110, obwohl ich im Constructor den Status auf 0 setze. Komisch dass, oder?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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-2025 by Thomas Breitkreuz