代码之家  ›  专栏  ›  技术社区  ›  Lodle

进程外渲染

  •  0
  • Lodle  · 技术社区  · 14 年前

    我试图为我的应用程序实现进程外渲染(就像chrome一样)。我已经设置好了ipc(进程间通信),但是当试图在另一个进程上初始化新表单时,它会死锁。

    如果需要,我很乐意提供示例代码。

    编辑:它在window api调用中死锁。在同一过程中运行良好

    1 回复  |  直到 14 年前
        1
  •  1
  •   Chris Becke    14 年前

    如果两个线程拥有任何关系类型的窗口,那么它们很容易耦合。

    这样做的有效结果是,您的IPC调用在等待应答时无法阻塞-您的IPC读取始终需要使用 MsgWaitForMultipleObjects 以便您可以在等待指示完成的IPC消息时处理来自其他进程/线程的窗口消息。


    您要做的是将当前对WaitForMultipleObjects的调用替换为MSGWaitForMultipleObjects。当它返回时,检查返回值。如果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
       }
    }