我試圖爲我的應用程序實現進程外渲染(就像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