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

Posted

技术标签:

【中文标题】Cromis IPC 同步 - 应用程序停止响应【英文标题】:Cromis IPC Synchronization - Application stops responding 【发布时间】:2012-09-09 07:23:28 【问题描述】:

我有一个服务应用程序,它使用 TADOConnection 连接到 MSSQL,并使用 Cromis.IPCTIPCServer 对象为客户端应用程序提供一些数据。此服务应用程序可能安装在运行 MSSQL 的同一台机器上,并且可能在 MSSQL 服务之前启动。所以,我无法在OnServiceStart 事件中连接到 ADO。我试图在TIPCServerOnExecuteRequest 事件中连接到ADO,但由于它在单独的线程中运行,我得到“尚未调用CoInitialize”。然后,我尝试将其与我的主线程同步,如下所示:

TThread.Synchronize(nil, ConnectDB);

但它没有用。我的应用程序立即停止响应。

接下来,我修改了OnExecuteRequest 事件以将调用它的线程作为参数传递,我尝试了这个:

AThread.Synchronize(AThread, ConnectDB);

但没有变化。当我打开 Use debug DCUs 时,我发现我的应用程序在这一行停止响应:

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

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


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


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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我知道CoInitialie(),但我也需要从我的主线程中访问 ADO 连接。 那么你需要两个独立的连接。 数据库连接是线程特定的。 :-) 想象一下,我的主线程中只需要 ADO 连接。我的问题是为什么调用Synchronize 会挂起...

以上是关于Cromis IPC 同步 - 应用程序停止响应的主要内容,如果未能解决你的问题,请参考以下文章

LINUX FIFO 命名管道 (IPC) 在特定文件描述符处停止写入/读取消息

使用信号量进行共享内存同步

多进程—进程同步控制,IPC

如果 Webhooks 响应错误,则停止 Ninja Forms 的进度

读取和写入共享文件时出现 IPC 同步问题

Electron Renderer 进程:我啥时候应该清理 IPC 监听器