我试图为我的应用程序实现进程外渲染(就像chrome所做的那样)。我有ipc(进程间通信)全部设置和工作,但它试图在另一个进程上启动一个新表单时只是死锁。进程外渲染
与继承处理为真正的没有任何别的东西,我需要做的我已经开始的过程?
我很高兴提供示例代码,如果需要的话。
编辑:它在窗口API调用死锁。运行良好时,在同一进程
我试图为我的应用程序实现进程外渲染(就像chrome所做的那样)。我有ipc(进程间通信)全部设置和工作,但它试图在另一个进程上启动一个新表单时只是死锁。进程外渲染
与继承处理为真正的没有任何别的东西,我需要做的我已经开始的过程?
我很高兴提供示例代码,如果需要的话。
编辑:它在窗口API调用死锁。运行良好时,在同一进程
,如果他们拥有的任何一种关系的窗口这是很容易将两个线程。
这样做的有效结果是,您的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
}
}
您必须提供相关代码。尝试使用调试器在代码中找到死锁的确切位置,然后发布它们。 – 2010-11-05 09:13:09
好的,哪些API?什么是参数? – 2010-11-05 09:16:38
多线程和多进程不同之处在于它们共享相同的内存空间和文件句柄,而在Windows中它们共享进程级资源。确保你的设置是正确的,因为你可能正在等待一些只有单进程范围的事件,所以你的其他进程不能设置它。 – CashCow 2010-11-05 09:28:09