写程序过程中,往往会遇到在按钮时间中执行一个循环事件(for/while)耗费比较长的时候,这个时候会造成界面的假死想象,对于经常写程序的人来说,解决起来相对比较容易,创建一个子线程,然后把事件放到子线程执行;但是对于初学者而言,创建子线程有时候又觉得麻烦,要解决这种问题其实不难,最容易想到的当然是sleep函数,但是测试效果并不理想,这里我介绍另外一种思路,在循环中调用如下函数即可,功能是获取消息并把消息给传递出去就可以了。
代码实现如下:
void DoLoopEvents(DWORD dwTimeout)
{
DWORD dwTickcount = GetTickCount();
while ( GetTickCount() - dwTickcount < dwTimeout )
{
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);//消息队列为空时闲置一段时间
}
}