MFC线程(一)简单介绍

MFC线程(一)简单介绍

ID:42139931

大小:87.88 KB

页数:27页

时间:2019-09-08

MFC线程(一)简单介绍_第1页
MFC线程(一)简单介绍_第2页
MFC线程(一)简单介绍_第3页
MFC线程(一)简单介绍_第4页
MFC线程(一)简单介绍_第5页
资源描述:

《MFC线程(一)简单介绍》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、MFC线程(一):简单介绍线程简介我们知道一般情况程序中的代码都是按顺序从头开始一行一行的执行以最后.中间不能出现同时执行的情况.比如一段代码调用两个函数FunOne();FunTwo();只要当函数FunOne中的代码执行完才返回来执行FunTwo.假如逻辑上是有先后顺序那还真只能这样按顺序执行下来.不过有假如FunOne与FunTwo没有逻辑先后顺序,是相互独立的.比如两个函数分别处理两不同的文件one.text与two.txt.这种情形就可以用到线程,弄两个线程去执行这两函数.这样两函数同时执行,提高了效率(如果单核的CPU可能没有真正的并行效果不明显,

2、那多核CPU执行多线程那是能够真正达到并行执行,效果很明显的).实际上可以这样简单的理解线程,它是CPU的调度单位.而一个线程是对应一个函数.所以别把一个线程想得太复杂,就只是执行个函数而已.只不过执行的时候是并行执行罢了.如果只是简单的几个线程不涉及使用共同的资源,没其他啥关联.就完全跟简单的执行一个函数类似.只是如果多个线程间关系复杂就会涉及到啥同步问题,那样就有很多复杂的细节性问题. 线程与函数线程函数必须是全局函数,或者是类的静态成员函数,因为非静态成员函数有this指针,而在进程中无法访问此指针。但是静态成员函数只能访问静态成员,解决此问题途径:1.

3、就是在调用静态成员函数时将this指针作为参数传入,通过该指针访问非静态成员。2.不将线程函数定义为类的静态成员函数,而是定义为类的友元函数,这样函数线程也可以有类成员函数相同的权限。 最简单示例线程分工作线程与界面线程.这里就以工作线程为例1.先来看个MFC中的创建线程的简单例子.UINTThreadFun(LPVOIDpParam){ //线程要调用的函数MessageBox(NULL,_T("iamcalledbyathread."),_T("threadfunc"),MB_OK);}::AfxBeginThread(ThreadFun,NULL); /

4、/这就是创建一个线程并执行了,调用上面的函数弹出一个对话框.2.示例分析上面的线程是简单的不能再简单了吧.下面从两个来分析下.a.首先是被调用的函数有啥讲究不?当然有,被线程用到的函数格式必须是统一的,返回类型必须是UINT,函数只能有一个参数LPVOID.其中UINT就是个无符号的整形,LPVOID是void*,所以这个参数表示可以传任何类型的指针过来的.b.函数AfxBeginThread的分析.这个函数还有返回值CWinThread*的,如果你只是简单的创建一个线程并执行,就不用管了.但如果想要对创建的线程做其他操作就必须这样写.CWinThread*p

5、Thread=::AfxBeginThread(ThreadFun,NULL);//接下来做啥就直接调用pThead就行.另外函数AfxBeginThread的参数有很多个,但很多都有默认值.下面是完整的参数CWinThread*AfxBeginThread(AFX_THREADPROCpfnThreadProc,//一个函数指针LPVOIDpParam,                              //void*类型的指针,可以传任何种类指针过来.intnPriority=THREAD_PRIORITY_NORMAL,    //线程优先级UN

6、TnStackSize=0,                         //分配堆栈大小DWORDdwCreateFlags=0,             //表示线程创建后是立即执行还是等会执行LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL //线程安全属性指针);//用于创建工作者线程上面的参数我们用的最多的是3个,其他一盘都默认值.AFX_THREADPROCpfnThreadProc//函数指针肯定是必须要指定的,不然线程执行哪个函数去啊LPVOIDpParam//这是传给上面指定函数的参数.如果被调用的函数需

7、要啥参数就只能在这里指定了.DWORDdwCreateFlags//默认值为0表示创建线程后立即执行.如果是CREATE_SUSPEND则表示创建好后先挂起.必须通过ResumeThread来执行.稍复杂点的例子扩充下上面的例子,给函数传入参数,并且休眠和挂起线程.UINTThreadFun(LPVOIDpParam){//线程要调用的函数int*pNum=(int*)pParam; //假如会传入一个整形指针参数MessageBox(NULL,_T("iamcalledbyathread."),_T("threadfunc"),MB_OK);}CWinThr

8、ead*pThread;//定义一个线

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。