大致的代码如下:HANDLE gWaitForQueryStop;
... ...DWORD WINAPI ThreadProc(LPVOID pParam)    //线程
{
    gWaitForQueryStop = CreateEvent(NULL, FALSE, TRUE, NULL);
    
    while (...)
    {
        ResetEvent(gWaitForQueryStop);
        FUCKYOU(....);
        SetEvent(gWaitForQueryStop);
    }
    ... ...
    return 0;
}void CClassDlg::OnButtonClick()    //IDC_BUTTON按钮,用于结束ThreadProc线程的按钮点击事件
{
    ... ...
    if (...)
    {
        GetDlgItem(IDC_BUTTON)->EnableWindow(FALSE);        AfxMessageBox(_T("FUCKYOU函数没有执行完,请等一下下!"));
        WaitForSingleObject(gWaitForQueryStop, INFINITE);        GetDlgItem(IDC_BUTTON)->EnableWindow(TRUE);
    }
    ... ...
}
简单说明:
线程中的FUCKYOU函数执行一次会花费5秒左右时间,触发某个OnButtonClick事件后,会判断FUCKYOU函数是否在执行期间,如果是就会弹出提示信息,并且会调用WaitForSingleObject进行等待,直到FUCKYOU函数处理完毕,然后结束ThreadProc线程。问题:
在WaitForSingleObject等待的这5秒期间,整个界面锁死的状态(IDC_BUTTON为不可用),这时我连续点IDC_BUTTON按钮(此时触发不了OnButtonClick事件)。但是等待结束之后(IDC_BUTTON变为可用),系统又会自动触发一次OnButtonClick事件。我估计是因为等待时候的点击事件延后到等待结束后触发了。我想让等待期间点击永远无效,等待结束之后也不会自动响应,请问有什么好方法吗?方法里最好不要用到计时器,自定义窗口。
谢谢

解决方案 »

  1.   

    WaitForSingleObject 放UI线程中,就会一直等待,造成界面锁死
      

  2.   

    在你线程函数中来控制UI等进入线程函数 
    GetDlgItem(IDC_BUTTON)->EnableWindow(FALSE);线程函数退出前,各种任务完成了,
    GetDlgItem(IDC_BUTTON)->EnableWindow(TRUE);
      

  3.   

    同时OnButtonClick 加一个变量来判断来弹出对话框,上一次没有执行完,就设置bFlag = TRUE.弹出对话框.
    执行完了,bFlag = FALSE;
      

  4.   

    设置一个标志位 FLAG 当进行等待时为TRUE 否则为FALSE
    然后在PreTranslateMessage将鼠标单击消息过滤掉(前提是当FLAG为TRUE时)
      

  5.   


    因为FUCKYOU(...)函数连续执行,上述方法会不会导致界面频繁的锁死?
    因为FUCKYOU(...)函数连续执行,这样做会不会导致按钮在可用与不可用之间来回不停变换?这样感觉很奇怪.
      

  6.   


    这个我试过,在等待的期间根本进不了PreTranslateMessage事件,无法做到过滤.
      

  7.   

    我最希望的状态就是:
    按下IDC_BUTTON,如果在等待期间,则弹出MessageBox,这个MessageBox没有OK按钮,无法手动关闭。
    直到等待结束,自动关闭MessageBox。
      

  8.   

    楼主根本不理解楼上的N位高人给你做的说明。
    问题 在于。你的OnButtonClick有两个线程 ,ui线程 和你的ThreadProc
    流程 是这样的,大致while(刷新界面)
    {
    OnButtonClick();//你在这里卡死的等(waitfor)ThreadProc,界面得不到刷新。
    }--------应改成以下。while(刷新界面)
    {
    OnButtonClick();//
    ontimer();//在这里check flag,
    }
      

  9.   

    不要用WaitForSingleObject一直等待。用SetTimer设置一个定时器,在定时函数中用WaitForSingleObject检查事件(等待时间给0),如果发现函数已经完成,则KillTimer并做相应的处理。
      

  10.   

    用MsgWaitForMultiObjects不是更好?