我有一个在线程中的
TADOConnection
。如果它连接数据库失败(超时),关闭应用程序时线程会被阻塞,直到尝试完成才能关闭应用程序。我不想减少连接超时时间,这不是问题所在。有没有办法强制中止连接尝试?
TADOConnection
在线程执行开始时连接,并自动重复重新连接,直到成功。然后,在关闭应用程序时,如果数据库无法连接,则线程会挂起,直到连接尝试完成(超时)。
编辑
以下是线程工作示例:procedure TMyThread.Init;
begin
CoInitialize(nil);
FDB:= TADOConnection.Create(nil);
FDB.LoginPrompt:= False;
FDB.ConnectionTimeout:= 5;
FDB.ConnectOptions:= coAsyncConnect;
end;
procedure TMyThread.Uninit;
begin
if FDB.Connected then
FDB.Connected:= False;
FDB.Free;
CoUninitialize;
end;
function TMyThread.Reconnect: Boolean;
begin
Result:= False;
if FDB.Connected then
FDB.Connected:= False;
FDB.ConnectionString:= FConnectionString;
try
FDB.Connected:= True; //How to abort?
Result:= True;
except
on e: exception do begin
//MessageDlg(e.Message, mtError, [mbOK], 0);
FDB.Connected:= False;
Result:= False;
end;
end;
end;
procedure TMyThread.Process;
begin
if Reconnect then begin //Once connected, keep alive in loop
while FActive do begin
if Terminated then Break;
if not Connected then Break;
//Do Some Database Work
end;
end else begin
//Log connection failure
end;
end;
procedure TMyThread.Execute;
begin
while not Terminated do begin
if FActive then begin
Init; //CoInitialize, create DB, etc.
try
while (FActive) and (not Terminated) do begin
try
Process; //Actual processing procedure
except
on e: exception do begin
//Record error to log
end;
end;
end;
finally
Uninit; //CoUninitialize, destroy DB, etc.
end;
end;
end;
end;
(尝试只包含与问题相关的内容)
TADOConnection.Cancel
。我不确定在同步模式下是否有中断连接过程的方法。 - TLamaConnectOptions
更改为coAsyncConnect
并在Stop
过程中添加FDB.Cancel
(停止线程中的任何操作)- 但没有成功:( - Jerry DodgeTADOConnection.Cancel
时,线程仍然挂起,直到尝试完成,它会暂停在那行代码上。 - Jerry Dodge