我正在使用 Delphi XE2 构建一个多线程的 Windows 服务应用程序,它使用 ADO 数据库组件连接 SQL Server。我之前在线程中多次使用过
这个函数叫做
我的问题是,我需要在这个函数内部调用
以下是代码...
CoInitialize(nil);
,但在这种情况下,我有一个函数不确定是否需要使用。这个函数叫做
TryConnect
,它尝试使用给定的连接字符串连接到数据库。它返回连接成功的 true 或 false。问题是,这个函数将在主服务线程内外都被使用,并且它将创建自己的临时 TADOConnection
组件,这需要使用 CoInitialize
...我的问题是,我需要在这个函数内部调用
CoInitialize
吗?如果我这样做,并且由于服务的执行过程也使用了 CoInitialize
,如果我从服务内部调用此函数,它们会干扰吗?TryConnect
函数位于从主服务线程创建的对象内(但最终将移到自己的线程中)。我需要知道在同一线程中两次调用 CoInitialize()
(和 CoUninitialize
)会产生干扰,并如何正确处理此场景。以下是代码...
//This is the service app's execute procedure
procedure TJDRMSvr.ServiceExecute(Sender: TService);
begin
try
CoInitialize(nil);
Startup;
try
while not Terminated do begin
DoSomeWork;
ServiceThread.ProcessRequests(False);
end;
finally
Cleanup;
CoUninitialize;
end;
except
on e: exception do begin
PostLog('EXCEPTION in Execute: '+e.Message);
end;
end;
end;
//TryConnect might be called from same service thread and another thread
function TDBPool.TryConnect(const AConnStr: String): Bool;
var
DB: TADOConnection; //Do I need CoInitialize in this function?
begin
Result:= False;
DB:= TADOConnection.Create(nil);
try
DB.LoginPrompt:= False;
DB.ConnectionString:= AConnStr;
try
DB.Connected:= True;
Result:= True;
except
on e: exception do begin
end;
end;
DB.Connected:= False;
finally
DB.Free;
end;
end;
为了澄清它真正的作用,我可能会遇到这种情况:
CoInitialize(nil);
try
CoInitialize(nil);
try
//Do some ADO work
finally
CoUninitialize;
end;
finally
CoUninitialize;
end;
CoInitialize()
表示你有STAs。COM必须为每个线程初始化,并且需要平衡调用CoInitialize()
/CoUnitialize()
。我不知道Delphi中如何工作,但你可能也需要在不同线程之间传递指针。 - Georg Fritzsche