我是靠谱客的博主 负责宝贝,最近开发中收集的这篇文章主要介绍MFC界面假死解决方案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

遇到繁忙的任务,mfc界面假死,不再响应,解决办法有两种

1.另开线程处理繁忙任务

2.在循环中强制分发消息 并响应。

第2种解决办法应对的场景:繁忙任务可以拆分切片,在循环体里多次调用。如果繁忙任务不可拆分,只能使用第一种办法,另开线程处理(不可拆分的情况:例如,调用外部封装的库函数,延时返回结果之前无法干预)。

第2种解决办法又分两种方式(看起来不同,但本质一样,代码也大同小异)

2.1 手动写出完整消息机制 窥视消息->过滤预翻译消息->翻译消息/分发消息

   

    int i=0;
    MSG _msg;
    while (1)//模拟任务循环
    {
        i++; //繁忙的任务
        if (PeekMessage(&_msg, NULL, 0, 0, PM_REMOVE))
        {
            if (!PreTranslateMessage(&_msg))
            {
                TranslateMessage(&_msg);
                DispatchMessage(&_msg);
            }
        }    
    }

2.2 一行封装好的代码 实现 消息循环

    int i=0;
    MSG _msg;
    while (1)
    {
        i++;
        AfxPumpMessage(); //包含完整的 窥视/过滤/翻译/分发消息 环节
    }

针对解决方案2.1中 PeekMessage参数PM_REMOVE的说明:

peekmessage为什么不可以用 PM_NOREMOVE? 必须移除消息? 因为繁忙任务造成消息阻塞无法响应,只能走自己实现的流程:强制分发响应,这个流程中也要模拟底层机制,及时拿到消息并移除,防止peekmessage拿到重复消息死循环(界面假死就解决不了了)。这涉及底层的消息机制:

while (GetMessage(&_msg, NULL, 0, 0))//注意GetMessage 默认会从队列中移除消息
{	
    if (!PreTranslateMessage(&_msg))
    {
	TranslateMessage(&_msg);
	DispatchMessage(&_msg);
    }	
}

2.1需要自己理解消息机制的细节,正确使用参数PM_REMOVE。

2.2最简洁,AfxPumpMessage一行代码搞定,封装屏蔽了技术细节。

最后

以上就是负责宝贝为你收集整理的MFC界面假死解决方案的全部内容,希望文章能够帮你解决MFC界面假死解决方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部