我有一個C++插件,它是爲一個專用軟件編寫的,該軟件對稱爲OpenLibrary的函數進行異步調用。要知道圖書館加載何時完成,我必須註冊一個特定事件。然後,當該事件被觸發時,將調用一個OnEvent例程。由於專有原因,這種邏輯有點消毒,但異步調用和onEvent觸發器正常工作。不幸的是,由於OpenLibrary調用是異步的,因此循環不會被阻塞,並且會繼續等待EVENT_LIBRARY_LOADED事件。我需要連續處理文件。爲現有異步代碼創建C++阻塞函數
...
void MyApp::main()
{
for(int i=0; i<total; ++i) {
pData->RegisterEvent(EVENT_LIBRARY_LOADED, this);
pData->OpenLibrary("c:/path/file.dat"); // asynchronous call
}
}
...
void MyApp::OnEvent(ID eventType)
{
if (eventType == EVENT_LIBRARY_LOADED) {
qDebug() << "Library load has completed";
}
}
...
該插件需要VS2008,並且還利用了Qt庫。
我想創建一個名爲waitForEvent的函數,其中後續代碼被阻塞,直到事件發生,然後waitForEvent可以將控制返回到調用例程循環。這樣,我可以留在我的主要例程循環中,只需等待事件再繼續。任何建議感激。
更新:我已經嘗試了以下兩種極好的建議,但在任何情況下,我都會得到相同的結果。 WaitForSingleObject或condition_variable.wait BOTH防止EVENT_LIBRARY_LOADED事件觸發OnEvent函數被調用,從而凍結循環。
其他建議讚賞。
使用互斥鎖和條件變量? –
這是我的理解是一個條件變量只在vC++ 11中可用?我在這方面做了許多嘗試,但由於經驗不足,我沒有得到任何地方。 – panofish
@panofish如果你真的必須堅持舊版本的C++,可以使用[boost庫](http://www.boost.org/) - 它提供了互斥和條件變量。或者,您可以實施[Peterson算法](http://en.wikipedia.org/wiki/Peterson's_algorithm)或任何其他[互斥](http://en.wikipedia.org/wiki/Mutual_exclusion)算法 –