佚名通过本文主要向大家介绍了
MFC界面上事件"滞后响应"的问题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: MFC界面上事件"滞后响应"的问题
描述:
简单说明:
线程中的FUCKYOU函数执行一次会花费5秒左右时间,触发某个OnButtonClick事件后,会判断FUCKYOU函数是否在执行期间,如果是就会弹出提示信息,并且会调用WaitForSingleObject进行等待,直到FUCKYOU函数处理完毕,然后结束ThreadProc线程。
问题:
在WaitForSingleObject等待的这5秒期间,整个界面锁死的状态(IDC_BUTTON为不可用),这时我连续点IDC_BUTTON按钮(此时触发不了OnButtonClick事件)。但是等待结束之后(IDC_BUTTON变为可用),系统又会自动触发一次OnButtonClick事件。我估计是因为等待时候的点击事件延后到等待结束后触发了。我想让等待期间点击永远无效,等待结束之后也不会自动响应,请问有什么好方法吗?
方法里最好不要用到计时器,自定义窗口。
谢谢
描述:
大致的代码如下:
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事件。我估计是因为等待时候的点击事件延后到等待结束后触发了。我想让等待期间点击永远无效,等待结束之后也不会自动响应,请问有什么好方法吗?
方法里最好不要用到计时器,自定义窗口。
谢谢