Cromis IPC同步 - 应用程序停止响应

时间:2012-09-09 07:23:29

标签: multithreading delphi windows-services ipc ado

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

TIPCServer

但它不起作用。我的申请就在那里停止响应。

接下来,我修改了TThread.Synchronize(nil, ConnectDB); 事件以传递调用它作为参数的线程,我尝试了这个:

OnExecuteRequest

但没有变化。当我打开使用调试DCU时,我发现我的应用程序在此行停止响应:

AThread.Synchronize(AThread, ConnectDB);

我完全迷失了。有什么想法吗?


PS:我没有提供我的代码来防止问题混乱。如果您需要它的任何部分,请告诉我。


PS 2:在此之前,我尝试在服务应用程序中使用Timer等待一段时间再连接到MSSQL。即使在加载网络驱动程序之前,MSSQL似乎很快就会启动(我安装了McAfee VSE 8.7,它取代了网络驱动程序)。我的服务连接到MSSQL,但是,当加载网络驱动程序时,连接中断。如果有一种方法告诉Windows(XP和更高版本)在加载网络驱动程序后启动服务,我的问题就解决了。任何提示都非常感激。

1 个答案:

答案 0 :(得分:1)

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

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