实现VB的DoEvents函数(VC++)

在VC++中,碰到了比如等待通讯数据等需要很长时间的循环时,在循环里加入类似VB的DoEvents函数,使画面一直处于事件响应状态。实际上,DoEvents函数的内容就是一个窗口消息处理环。

void DoEvents()
{
    MSG msg;
    while(::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE))
    {
        if (!AfxGetApp()->PumpMessage())
        return;
    }
}

void DoEvents()
{
    MSG msg;
    while (::GetMessage(&msg, NULL, NULL, NULL))
    {
        if (!PreTranslateMessage(&msg))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
    }
}


注意点:这种方法在长时间的循环処理中能不断进行画面操作,可以说这个DoEvents手法还是挺方便的。可是在DoEvents()中,

任何Windows的消息多可能被处理,有时出现了预料不到的结果。所以,尽可能使用下面函数中的wMsgFilterMin和wMsgFilterMax参数,

对处理的消息种类作适当制限,编出更加安全的DoEvents()。

BOOL PeekMessage(	LPMSG lpMsg, // pointer to structure for message
			HWND hWnd, // handle to window
			UINT wMsgFilterMin, // first message
			UINT wMsgFilterMax, // last message
			UINT wRemoveMsg // removal flags
			);

BOOL GetMessage(	LPMSG lpMsg, // address of structure with message
			HWND hWnd, // handle of window
			UINT wMsgFilterMin, // first message
			UINT wMsgFilterMax // last message
			);

最后一句话:如果是长时间循环处理,使用多线程

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值