簡體   English   中英

C ++事件信號和后台線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM