2010-11-05 67 views
0

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

与继承处理为真正的没有任何别的东西,我需要做的我已经开始的过程?

我很高兴提供示例代码,如果需要的话。

编辑:它在窗口API调用死锁。运行良好时,在同一进程

+0

您必须提供相关代码。尝试使用调试器在代码中找到死锁的确切位置,然后发布它们。 – 2010-11-05 09:13:09

+0

好的,哪些API?什么是参数? – 2010-11-05 09:16:38

+0

多线程和多进程不同之处在于它们共享相同的内存空间和文件句柄,而在Windows中它们共享进程级资源。确保你的设置是正确的,因为你可能正在等待一些只有单进程范围的事件,所以你的其他进程不能设置它。 – CashCow 2010-11-05 09:28:09

回答

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 
    } 
} 
+0

我使用WaitForMultipleObjects作为ipc atm。我将如何将其更改为使用MsgWaitForMultipleObjects? – Lodle 2010-11-05 09:22:30

+0

我想我明白了。所以在我的ipc读线程中,我也会运行一个消息泵,然后我会偷看或读取没有留下的消息,然后使用MsgWaitForMultipleObjects,一旦完成窥视并重新读取? – Lodle 2010-11-05 09:28:47

+0

谢谢。我试试吧 – Lodle 2010-11-05 10:15:34