MFC下的多线程和自定义消息收发

2 篇文章 0 订阅
不仅在MFC的程序中,其他设计库如qt,也会存在运行时界面卡死的问题,导致这个问题的原因是内部存在多次循环,界面更新函数处理不过来,消息队列阻塞。为解决这一问题,多线程是首选。也有通过在单线程循环中PeekMessage来解决界面卡死问题,试了一下,效果也很明显,但这个方法只是备选方案,最终的解决之道还是要走多线程。

网络上关于MFC线程的文章很多,也很全,权威的要看MSDN的解释,不过MSDN很多地方是机器翻译的,需要适应它的讲话方式;个人网站也有许多相关文章,但可惜大部分都是转载,千篇一律,语言专业,不适合入门的人,特别是基础不好的人,苦苦搜索一番,也不知道从哪里下手。经过几天的摸索,才稍有明白,将多线程使用到的相关知识简单概括,结合自己的经历使这个说法更容易理解。


在MFC中如果不用多线程,那么程序所有代码运行在主线程上。如果使用多线程,那主线程与子线程是分开的。经常用到的MFC线程类型是Worker Thread,这种线程是指创建的线程是程序内部真正干活的那部分。主线程不管其他的事情,只负责收发消息,子线程负责干活,在子线程干活过程中如果有需要通知主线程处理,否则就继续干活,直到活儿结束后汇报给主线程。把耗时费力的部分单独放到一个线程中执行,可以有效解决界面无响应的问题。


线程的相关函数很多,最常用的一个函数是AfxBeginThread,这个函数用于创建一个独立的线程,返回的是线程句柄。
AfxBeginThread函数的一个好用的地方是它可以在第二个形式参数处传递主线程的实参,因为在子线程中是不能直接操做界面的,所以传递参数的好处是可以通过参数获得主线程的一些数值。需要注意的一点是线程函数必须声明为全局函数,这个可以理解为,主线程的成员函数,子线程是不能调用的,除非是静态成员。

创建线程后,就不用管了,MFC已经自动处理其他事务。


那么,还有另一个问题多数情况伴随着多线程,也就是消息怎样传递,或者他们怎样通信。据网络上提供的方法,可以全局变量,通过HEVENT 事件,通过自定义消息。使用自定义消息的话,首先明白内部的函数映射过程。一个按钮点击事件发生时,在MESSAGE_MAP中找到对应的消息响应函数,在头文件中找到该函数的声明,在cpp文件中找函数定义,执行函数体内的语句,这个处理过程是通过ON_BN_CLICKED函数响应;而消息处理的时候是通过ON_MESSAGE映射处理的。按照流程,补充消息处理部分。
修改为多线程后,界面即时刷新,无响应情况没有出现
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值