我试图为我的应用程序实现进程外渲染(就像chrome那样)。我有ipc(进程间通信)所有设置和工作,但它只是在尝试在另一个进程上初始化一个新表单时死锁。
我已经使用继承句柄启动了该过程,因为我还需要做其他事情吗?
我很乐意在需要时提供示例代码。
编辑:它在窗口api调用中死锁。在同一过程中运行正常
答案 0 :(得分:1)
如果两个线程拥有任何关系的窗口,那么它很容易耦合。
这样做的有效结果是,你的IPC调用在等待回复时无法阻塞 - 你的IPC读取总是需要使用MsgWaitForMultipleObjects,这样你就可以在等待时从其他进程/线程处理窗口消息IPC消息表明完成。
您要做的是用MSGWaitForMultipleObjects替换当前对WaitForMultipleObjects的调用。返回时,检查返回值。如果nCount是您等待发出信号的IPC句柄数:
// Pump messages while waiting on 0 or more handles.
for(;;)
{
while(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DWORD ret = MsgWaitForMultipleObjects(nCount,pHandles,FALSE,dwTimeout,QS_ALLEVENTS);
if(ret >= WAIT_OBJECT_0 && ret < (WAIT_OBJECT_0 + nCount))
{
// one of the handles was signalled.
return ret;
}
else if(ret == WAIT_OBJECT_0 + nCount)
{
// The wait was aborted because there is at least one message,
// go back to pumping messages
continue;
}
else
{
// test for WAIT_OBJECT_ABANDONED_0, WAIT_TIMEOUT etc. as appropriate
}
}