比如在一个对话框上放置两个按钮,在第一个按钮的响应函数中首先置另一个按钮DISABLE,然后SLEEP(5000),最后再将另各个按钮恢复为ENABLE.
问题是在SLEEP(5000)的时间里点击了一次第二个按钮,5秒钟一过第二个按钮就响应了,有什么办法不让它响应在SLEEP(5000)的时间里点击了第二个按钮的消息.

解决方案 »

  1.   

    设个flag如何
    sleep时将flag置成false
    点第二个按钮时先判断flag,再决定响不响应
      

  2.   

    在SLEEP(5000)的时间里点击了一次第二个按钮,此时由于第二个按钮处于DISABLE,消息虽然没有响应但还在栈里,只要一ENABLE就会响应.
    即使设了标志,但什么时候置为True呢?
    不过倒给我一个启发,我先试试.
      

  3.   

    flag = FALSE;
    sleep(5000)
    flag = TRUE;
      

  4.   

    你可以用一个Timmer来解决问题,又不会有消息入队等待的情况。
    void CXXXDlg::OnBtn1()
    {
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
    SetTimer(1234, 5000, NULL);
    }void CXXXDlg::OnTimer(UINT nIDEvent) 
    {
    if (nIDEvent == 1234)
    GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);

    ...
    }
      

  5.   

    况且你的Sleep()可能会造成整个界面对用户的操作都无法响应,比如移动... 如果Sleep()在你的主线程中。
      

  6.   

    查了msdnSleep: Description
    Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds. The thread does not lose ownership of any monitors. 
    其中最重要是The thread does not lose ownership of any monitors. 中文意思是sleep期间不会失去任何动作。
      

  7.   

    sleep不能放到主线程中,否则会阻塞你的程序的,放到线程中
    然后用一个全局的flag,分别设置为true(开始),false(停止)
      

  8.   

    十分感谢大家.
    我最后的解决方法是:
    void CXXXDlg::OnBtn1()
    {
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
             m_bFlag=FALSE;
             Sleep(5000);
             GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
    SetTimer(1, 500, NULL);
    }
    void CXXXDlg::OnBtn2()
    {
    if(m_bFlag==TRUE)
             {
                       AfxMessageBox("botton2 is click!");
              }
    }
    void CXXXDlg::OnTimer(UINT nIDEvent) 
    {
    if (nIDEvent == 1)
             {
    m_bFlag=TRUE;
             }             

    ...
    }
    Sleep()只是想模拟一个消耗(独占)cpu5秒的处理.
    这个方法虽然笨一点,而且不够规范.最好是将处理放到线程中,不过是给别人用的,而且他又不想改动处理部分,没办法只好先这样.