0

这是我在 C++ 代码实现中遇到的问题。

在主线程中,创建了一个显示带有取消按钮的静态文本的对话框,该按钮还旋转了一个子线程。

在后台线程(或子线程)中检查数据库以查看某个状态字段是否已更新。如果更新,则返回 true,否则继续定期轮询数据库。

预期行为 - 显示带有取消按钮的对话框,继续显示它,直到子线程发出事件信号或用户点击取消按钮。

我在主线程中创建了一个未发出信号状态的事件,该事件状态将由子线程修改(当状态字段更新时)。

问题是如果我阻塞主线程直到它从后台线程得到响应,用户无法点击对话框中的取消按钮,它总是伴随着沙漏符号。

不知道下面的代码有什么问题。

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;
}
4

2 回答 2

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;

这将检查每 500 毫秒的事件状态。如果发出信号,则对话结束,如果没有,则继续。

于 2012-09-22T07:55:45.410 回答
0

您也可以使用 MsgWaitForMultipleObjectsEx() :http: //msdn.microsoft.com/en-us/library/windows/desktop/ms684245%28v=vs.85%29.aspx

于 2012-09-22T12:29:41.113 回答