不仅在MFC的程序中,其他设计库如qt,也会存在运行时界面卡死的问题,导致这个问题的原因是内部存在多次循环,界面更新函数处理不过来,消息队列阻塞。为解决这一问题,多线程是首选。也有通过在单线程循环中PeekMessage来解决界面卡死问题,试了一下,效果也很明显,但这个方法只是备选方案,最终的解决之道还是要走多线程。
AfxBeginThread函数的一个好用的地方是它可以在第二个形式参数处传递主线程的实参,因为在子线程中是不能直接操做界面的,所以传递参数的好处是可以通过参数获得主线程的一些数值。需要注意的一点是线程函数必须声明为全局函数,这个可以理解为,主线程的成员函数,子线程是不能调用的,除非是静态成员。
修改为多线程后,界面即时刷新,无响应情况没有出现
网络上关于MFC线程的文章很多,也很全,权威的要看MSDN的解释,不过MSDN很多地方是机器翻译的,需要适应它的讲话方式;个人网站也有许多相关文章,但可惜大部分都是转载,千篇一律,语言专业,不适合入门的人,特别是基础不好的人,苦苦搜索一番,也不知道从哪里下手。经过几天的摸索,才稍有明白,将多线程使用到的相关知识简单概括,结合自己的经历使这个说法更容易理解。
在MFC中如果不用多线程,那么程序所有代码运行在主线程上。如果使用多线程,那主线程与子线程是分开的。经常用到的MFC线程类型是Worker Thread,这种线程是指创建的线程是程序内部真正干活的那部分。主线程不管其他的事情,只负责收发消息,子线程负责干活,在子线程干活过程中如果有需要通知主线程处理,否则就继续干活,直到活儿结束后汇报给主线程。把耗时费力的部分单独放到一个线程中执行,可以有效解决界面无响应的问题。
AfxBeginThread函数的一个好用的地方是它可以在第二个形式参数处传递主线程的实参,因为在子线程中是不能直接操做界面的,所以传递参数的好处是可以通过参数获得主线程的一些数值。需要注意的一点是线程函数必须声明为全局函数,这个可以理解为,主线程的成员函数,子线程是不能调用的,除非是静态成员。
创建线程后,就不用管了,MFC已经自动处理其他事务。
修改为多线程后,界面即时刷新,无响应情况没有出现