2012-09-09 36 views
1

我有一个服务应用程序,它使用TADOConnection连接到MSSQL,并使用Cromis.IPCTIPCServer对象向客户端应用程序提供一些数据。此服务应用程序可能安装在运行MSSQL的同一台计算机上,并可能在MSSQL服务之前启动。所以,我无法在​​事件中连接到ADO。我尝试在OnExecuteRequest事件TIPCServer中连接到ADO,但由于它在单独的线程中运行,因此我得到了“CoInitialize尚未被调用”。然后,我试图与我的主线程同步这样:Cromis IPC同步 - 应用程序停止响应

TThread.Synchronize(nil, ConnectDB); 

但它没有工作。我的应用程序在那里停止响应。

接下来,我修改了OnExecuteRequest事件通过其调用它作为参数的线程,我想这一点:

AThread.Synchronize(AThread, ConnectDB); 

但没有改变。当我打开使用调试的DCU,我发现我的应用程序停止响应在这条线:

function WaitForSyncWaitObj(P: Pointer; Timeout: Cardinal): Integer; 
begin 
    Result := WaitForSingleObject(THandle(P), Timeout); // <-- I'm stuck here... 
end; 

我完全丧失。有任何想法吗? PS:我没有提供我的代码来防止混乱的问题。如果你需要它的任何部分,请让我知道。


PS 2:在此之前,我试图用一个定时器在我的服务应用程序连接到MSSQL之前等待一段时间。即使在网络驱动程序加载之前(我已安装替换网络驱动程序的McAfee VSE 8.7),似乎MSSQL很快启动。我的服务连接到MSSQL,但是,当网络驱动程序加载时,连接中断。如果有一种方法可以告诉windows(XP及更高版本)在网络驱动程序加载后启动服务,我的问题就解决了。任何暗示真的很感激。

回答

1

在你的TThread构造函数中调用CoInitialize(nil);,在它的析构函数中调用CoUnitialize。他们都在ComObj单位申报;您可能需要将其添加到包含线程类的单元中的uses子句。

数据库连接是线程专用的(意思是每个线程必须有它自己的连接),并且ADO需要COM;这意味着线程必须为自己初始化COM,并且应该在线程结束时释放它。

+0

我知道'CoInitialie()',但我需要从我的主线程访问ADO连接。 –

+0

然后你需要两个单独的连接。 **数据库连接再次是线程特定的**。 :-) –

+0

想象一下,我只需要在我的主线程中使用ADO连接。我的问题是为什么调用'Synchronize'挂起... –