主线程消息处理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值