概述
遇到繁忙的任务,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界面假死解决方案所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复