取消ADO Connection尝试连接?

时间:2013-01-19 14:40:01

标签: delphi timeout delphi-xe2 ado abort

我在一个帖子里面有一个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;

(试图在问题中包含相关内容)

1 个答案:

答案 0 :(得分:2)

首先想到的是减少连接的超时。你为什么不想要那个?为什么要在关闭应用程序时建立连接?特别是当你想要在比预期花费更多时间时中止它时,为什么要连接呢?听起来我们可以知道更多背景信息。

在特殊情况下,如果它快速连接,你确实需要它,当这个问题适用于应用程序的销毁时,我建议不要等待线程完成。只是不要释放它,终止应用程序,让Windows终止进程,包括其所有线程。

如果连接 成功,那么这种方法可能会适得其反,因此当线程连接时发出主线程信号,并通过等待线程推迟终止。你可能需要再次超时。

编辑:

我想每次尝试连接时都会发生OnWillConnect事件。尝试在其处理程序中返回EventStatus := esCancel