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