[英]C++ Event signal and background thread
這是我在c ++代碼實現中遇到的問題。
在主線程中,創建一個對話框,該對話框顯示帶有“取消”按鈕的靜態文本,該對話框也旋轉一個子線程。
在后台線程(或子線程)中,檢查數據庫以查看特定狀態字段是否已更新。 如果已更新,則返回true,否則繼續定期輪詢數據庫。
預期行為-顯示帶有“取消”按鈕的對話框,繼續顯示該對話框,直到子線程發出事件信號或用戶單擊“取消”按鈕為止。
我在主線程中以無信號狀態創建了一個事件,該事件狀態將由子級修改(當status字段更新時)。
問題是,如果我阻塞主線程,直到它從后台線程得到響應,則用戶無法單擊對話框中的“取消”按鈕,它總是帶有沙漏符號。
不知道下面的代碼有什么問題。
HANDLE mainThread = NULL;
HANDLE ghWriteEvent;
MainMethod()
{
mainThread = GetCurrentThread() ;
dlgCancelDialog dog // dialog with cancel button .
ghWriteEvent = CreateEvent( NULL, TRUE, FALSE, TEXT("WriteEvent") );
HANDLE hThread = CreateThread(0,0, childThread, &threadData,0,NULL);
dlg.showDialog(); // Show dialog with cancel button .
DWORD dwWaitResult = WaitForSingleObject( ghWriteEvent, INFINITE);
//AT THIS POINT i WANT TO SAY WAIT FOR SIGNAL EVENT OR WAIT UNTIL CANCEL OPERATION IS HIT , BUT THE DIALOG IS SHOWN WITH HOURGLASS SYMBOL.
switch (dwWaitResult)
{
// Event object was signaled
case WAIT_OBJECT_0:
break;
}
dlg.hideDialog();
} //子線程代碼。
childThread(LPVOID lpParam)
{
while(!databaseIsUpdated) // Check database.
{
Sleep(1000);
}
if (! SetEvent(ghWriteEvent) )
{
return 0;
}
return 0;
}
您不應該等待INFINITE,因為您阻塞了對話線程。
所以我的建議是,使用SetTimer(hDlg,500,1,NULL)創建計時器,並在DlgProc中處理WM_TIMER,如下所示:
case WM_TIMER:
{
DWORD dwWaitResult = WaitForSingleObject( ghWriteEvent, 0); //We will not wait
if(dwWaitResult == WAIT_OBJECT_0) //We are signaled, exit now
dlg.hideDialog();
}
break;
這將每500ms檢查一次事件狀態。如果發出信號,則對話框結束,否則,繼續。
你也可以使用MsgWaitForMultipleObjectsEx(): http://msdn.microsoft.com/en-us/library/windows/desktop/ms684245%28v=vs.85%29.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.