比如在一个对话框上放置两个按钮,在第一个按钮的响应函数中首先置另一个按钮DISABLE,然后SLEEP(5000),最后再将另各个按钮恢复为ENABLE.
问题是在SLEEP(5000)的时间里点击了一次第二个按钮,5秒钟一过第二个按钮就响应了,有什么办法不让它响应在SLEEP(5000)的时间里点击了第二个按钮的消息.
问题是在SLEEP(5000)的时间里点击了一次第二个按钮,5秒钟一过第二个按钮就响应了,有什么办法不让它响应在SLEEP(5000)的时间里点击了第二个按钮的消息.
sleep时将flag置成false
点第二个按钮时先判断flag,再决定响不响应
即使设了标志,但什么时候置为True呢?
不过倒给我一个启发,我先试试.
sleep(5000)
flag = TRUE;
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);
...
}
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期间不会失去任何动作。
然后用一个全局的flag,分别设置为true(开始),false(停止)
我最后的解决方法是:
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秒的处理.
这个方法虽然笨一点,而且不够规范.最好是将处理放到线程中,不过是给别人用的,而且他又不想改动处理部分,没办法只好先这样.