2010-11-05 94 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