`
yingyingol
  • 浏览: 745092 次
文章分类
社区版块
存档分类
最新评论

MFC多线程基础

 
阅读更多
还是老师的那个项目,以前由于计算量太大,导致程序经常出现假死的现象,因为程序只有一个线程,该线程主要用于处理计算上了,而对于消息队列的响应被忽略了。因此解决的办法就是用两个线程,一个线程用于计算,一个线程用于处理消息。
到网上找了一些资料,发现在MFC中把线程分为两类,一类为界面线程,一类为工作线程。两者的区别在于前都能够处理消息响应,而后者则不能。对于该项目来说,只要把计算的过程放到一个工作线程里来进行就可以了。
现在先试一下,我新建了一个对话框,上面添加两个按钮,一个是start 一个是dialog。前者用于开始计算,而后者则弹出一个消息框。然后向该对话框里面添加一个死循环的函数
UINT CMultithreadDlg::jisuan(LPVOID lpParam)
{
int i = 1;
for (;;)
{
i+=i;
}
return 0;
}
然后在start按钮的响应函数上添加上jisuan(NULL);即可,现在运行程序,按下start按钮后,可以看到CPU使用率涨到了100%,这个时候再按dialog按钮无反应,拖动关闭窗口均无效。这就是前面提到的假死现象(实际上是真死,因为死循环了,如果不是死循环,而只是计算量太大才是假死)。

下面用多线程的方法来解决,在start按钮的响应函数改为
CWinThread* mythread = AfxBeginThread(
jisuan,
NULL,
THREAD_PRIORITY_NORMAL,
0,
0,
NULL
);
运行,结果发现有错error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)' Generating Code...
我就纳闷了,函数指针是对的啊,原来 线程函数可以且必须是全局函数或者是静态成员函数。
所以我们在线程函数的声明中改为 static UINT jisuan(LPVOID lpParam);即可,然后运行程序,这时点击start,待CPU涨至100%后,点击dialog,弹出对话框了,拖动、关闭窗口均没问题了。

其实上面的那个AfxBeginThread,除前面两个参数外,后面的都是默认参数,可以省略。而必须有的这两个参数,一个是线程函数的指针,一个是传递给这个函数的参数。实际中我们经常这样用 AfxBeginThread(ThreadProc,this);//把this传过去,就可以调用类的成员了. 这样线程函数就可以使用和操作类的成员了。千万要注意线程函数是静态类函数成员。

线程是创建了,但是如果中途要暂停该怎么做呢?
我们在创建线程的时候获得了一个CWinThread的指针,这是一个指向线程对象的指针,CWinThread类里面就有暂停与恢复的函数,下面我就演示一下。
在原来的程序上进行改动。向对话框类里面添加一个CWinThread* 的成员变量,不用初始化为NULL,这样会报错的,因为它只能通过AfxBeginThread函数获得。把start里面的声明去掉。
然后添加一个 pause 按钮向其响应函数里面添加代码 mythread->SuspendThread(); 再添加一个 resume按钮,向其响应函数里面添加 mythread->ResumeThread();
再运行程序,我们start之后,按下pause可以看到CPU恢复正常,然后resume,CPU又涨上去了,到此证明一切操作正常。

分享到:
评论

相关推荐

    MFC多线程基础解析及例子

    MFC多线程基础解析及例子,帮助学习多线程。以后再补充

    实用MFC多线程编程基础

    实用MFC多线程编程基础,原理、实例均有介绍,通俗易懂。值得看看

    实用MFC多线程编程基础.pdf

    实用MFC多线程编程基础.pdf

    基于VC++6.0MFC的多线程通信技术研究

    基于微软基础类库MFC(Microsoft Foundation ClassLibrary)实现多线程通信程序。其意义在于恰当地解决了软件逆向工程的需要、软件复用、软件可靠性、模块化及开发时间、费用等方面的综合要求。 通过对目标系统及软件...

    实用MFC多线程编程基础[定义].pdf

    实用MFC多线程编程基础[定义].pdf

    MFCVS2008数据库SQL串口收发多线程文件存储

    数据库SQL登入界面(数据库:Thread ,表名等内容可在登入文件中查找,不再赘述); 串口通信,数据收发; 文件存储,10条存储,可上下查询(请...多线程、定时器、按钮等功能; 带注释,比较基础,但内容全面,莫见笑……

    多线程资料基础资料

    MFC下的多线程编程.ppt Windows多线程编程.pdf WINDOWS核心编程.chm 多线程编程简明教程(附代码和文档) 这些是windows下多线程编程的基础资料,可以说是入门必备资料!相当的不错!可以应付一般的多线程问题,至于...

    多线程mfc的例程代码

    使用多线程编程,以vc++框架中mfc为基础,为初学者的例程分析代码

    MFC基础学习PPT课件(16个)

    多线程和同步【】MFC_11.进程的控制和访问【】MFC_12.动态链接库和钩子【】MFC_13.远程DLL注入【】MFC_14.网络编程【】MFC_15.ICMP协议编程【】MFC_16.数据库访问【IT 资源太大,传百度网盘了,链接在附件中,有需要...

    VC 初级多线程编程实例源码集.rar

    个人整理的一些比较基础的VC 初级多线程编程实例集,包括安全终止线程、创建UI线程、创建Worker线程、等待线程结束、挂起和恢复线程、获得线程的退出码、使用互斥量、使用临界区、使用信号量等内容,相信对VC 初学者...

    《Windows多线程编程技术与实例》-郝文化-书和源码

    本书通过众多实例介绍了如何实现Windows下的多线程编程,既重点介绍了Win32API下的多线程编程和MFC下的多线程编程,又介绍了多线程机制在网络编程、图形编程和数据库中的应用。本书每一章都从简单的多线程实例出发...

    操作系统实现多线程同步MFC源程序

    实验名称:windows系统的... 在掌握基于消息的windows程序结构和多线程程序设计方法的基础上,设计一个多线程同步的程序。使学生能够从程序设计的角度了解多线程程序设计的方法和在windows系统下多线程同步互斥的机制。

    VC.MFC套接字socket网络编程,完整代码高速文件传输,多线程,可直接生成使用,VS2010

    采用VS2010,基于MFC实现大文件高速传输,socket同步异步灵活切换使用,多进程。完整项目,可直接生成使用。非常适合初学者和有一定基础的提高者。自定义对话框工具,设计完美,界面美观。学习交流,拒绝商用。宸宸...

    多线程编程的入门教程

    本文档适合初学者学习多线程,文档讲解四种多线程,使用VS2010,基于MFC对话框编写例子,简单易懂。

    win32多线程程序设计 pdf

    使用线程,你可以产生高效率的服务器。... 写出这样的软件,需要更多的理论基础,以及一本参考手册;需要广泛了解每一件事情如何彼此相称;需要一份指南,告诉你什么可以...·如何在多线程环境中使用Cruntime函数库和MFC。

    基于MFC编写的示波器演示程序

    基于VC6.0MFC编写的示波器演示程序,内含所有源代码及发布程序,可以生成基础波形并进行测量。

    Windows多线程编程技术与实例.pdf

     本书通过众多实例介绍了如何实现Windows下的多线程编程,既重点介绍了Win32API下的多线程编程和MFC下的多线程编程,又介绍了多线程机制在网络编程、图形编程和数据库中的应用。本书每一章都从简单的多线程实例出发...

    MFC基础教程

    共14章、442页,涵盖了vc的基础介绍,以及mfc程序的创建,控件的使用、多线程、多媒体编程、网络编程、动态链接库的使用等等,是那些喜欢MFC但是不知道从何学起的MFC爱好者的最佳的基础教材!

    MFC深入浅出带目录完整版(李久进chm版)

    并且进一步阐述MFC的核心概念之一:状态(模块状态、线程状态、模块线程状态),揭示MFC对多线程的支持机制,MFC实现规则DLL和扩展DLL的内幕。 第十章,阐述MFC下的调试手段。 第十一章,讨论CFile类,主要分析了...

Global site tag (gtag.js) - Google Analytics