主线程消息处理

写程序过程中,往往会遇到在按钮时间中执行一个循环事件(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);//消息队列为空时闲置一段时间 
    }
}

猜你喜欢

转载自blog.csdn.net/u012156872/article/details/106391538