当应用程序进行复杂计算或占用很多系统资源的操作时,用户点击程序界面按钮时无法响应,有两种解决方法:计算线程,消息循环重载技术,即在应用程序中处理Windows消息循环。这样既可以在主线程中进行复杂计算以满足实时计算要求,又能即使响应用户输入,随时中止计算!
举例如下:
while(!m_bStop && iStep <= 500) {
iStep++;
m_pgProgress.StepIt();
Sleep(20);
DoEvents(); // 二次消息循环函数
}
void DoEvents()
{
MSG msg;
if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { //从Windows消息队列中取出消息
if (msg.message== WM_QUIT)//如果消息为退出,发送退出消息
{
::PostQuitMessage(-1);
}
if(!AfxGetApp()->PreTranslateMessage(&msg))//如果无法预处理消息
{
::TranslateMessage(&msg);//转换消息
::DispatchMessage(&msg);//发送消息
}
}
AfxGetApp()->OnIdle(0);AfxGetApp()->OnIdle(1);//消息队列为空时闲置一段时间
}
举例如下:
while(!m_bStop && iStep <= 500) {
iStep++;
m_pgProgress.StepIt();
Sleep(20);
DoEvents(); // 二次消息循环函数
}
void DoEvents()
{
MSG msg;
if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { //从Windows消息队列中取出消息
if (msg.message== WM_QUIT)//如果消息为退出,发送退出消息
{
::PostQuitMessage(-1);
}
if(!AfxGetApp()->PreTranslateMessage(&msg))//如果无法预处理消息
{
::TranslateMessage(&msg);//转换消息
::DispatchMessage(&msg);//发送消息
}
}
AfxGetApp()->OnIdle(0);AfxGetApp()->OnIdle(1);//消息队列为空时闲置一段时间
}
本文介绍了一种在应用程序中处理复杂计算同时确保用户界面响应性的方法。通过使用计算线程和消息循环重载技术,可以实现在主线程进行计算的同时响应用户操作。文章提供了具体的实现代码示例。
1016

被折叠的 条评论
为什么被折叠?



