进程外渲染

时间:2010-11-05 09:09:01

标签: c++ windows visual-studio-2010

我试图为我的应用程序实现进程外渲染(就像chrome那样)。我有ipc(进程间通信)所有设置和工作,但它只是在尝试在另一个进程上初始化一个新表单时死锁。

我已经使用继承句柄启动了该过程,因为我还需要做其他事情吗?

我很乐意在需要时提供示例代码。

编辑:它在窗口api调用中死锁。在同一过程中运行正常

1 个答案:

答案 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
   }
}