大致的代码如下: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事件。我估计是因为等待时候的点击事件延后到等待结束后触发了。我想让等待期间点击永远无效,等待结束之后也不会自动响应,请问有什么好方法吗?方法里最好不要用到计时器,自定义窗口。
谢谢
... ...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事件。我估计是因为等待时候的点击事件延后到等待结束后触发了。我想让等待期间点击永远无效,等待结束之后也不会自动响应,请问有什么好方法吗?方法里最好不要用到计时器,自定义窗口。
谢谢
GetDlgItem(IDC_BUTTON)->EnableWindow(FALSE);线程函数退出前,各种任务完成了,
GetDlgItem(IDC_BUTTON)->EnableWindow(TRUE);
执行完了,bFlag = FALSE;
然后在PreTranslateMessage将鼠标单击消息过滤掉(前提是当FLAG为TRUE时)
因为FUCKYOU(...)函数连续执行,上述方法会不会导致界面频繁的锁死?
因为FUCKYOU(...)函数连续执行,这样做会不会导致按钮在可用与不可用之间来回不停变换?这样感觉很奇怪.
这个我试过,在等待的期间根本进不了PreTranslateMessage事件,无法做到过滤.
按下IDC_BUTTON,如果在等待期间,则弹出MessageBox,这个MessageBox没有OK按钮,无法手动关闭。
直到等待结束,自动关闭MessageBox。
问题 在于。你的OnButtonClick有两个线程 ,ui线程 和你的ThreadProc
流程 是这样的,大致while(刷新界面)
{
OnButtonClick();//你在这里卡死的等(waitfor)ThreadProc,界面得不到刷新。
}--------应改成以下。while(刷新界面)
{
OnButtonClick();//
ontimer();//在这里check flag,
}