MFC全局函数fxBeginThread_第1页
MFC全局函数fxBeginThread_第2页
MFC全局函数fxBeginThread_第3页
MFC全局函数fxBeginThread_第4页
MFC全局函数fxBeginThread_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、mfc全局函数afxbeginthread 及其与createthread 的区别(2009-08-1811:03:18)转载标签:分类:技术afxbeginthreadcreatethreadit函数功能描述:创建新的线程函数原型:cwinthread*afxbeginthread(afx_threadprocpfnthreadproc,lpvoidpparam,intnprior ity=thread_priority_normal,uintnstacksize=0,dworddwcreateflags=0,lpsecurity_ attributeslpsecurityattrs=nul

2、l);cwinthread*afxbeginthread(cruntimeclass*pthreadclass,intnpriority=thread_priori ty_normal,uintnstacksize=0,dworddwcreateflags=0,lpsecurity_attr旧uteslpsecurityattrs=null);返回值:指向新创建的线程对象。参数:pfnthreadproc :工作线程的函数指针,不可以为空。并且工作线程的函数必须如此声明:uintmycontrollingfunction(lpvoidpparam);pthreadclass :从 cwinth

3、read 类继承来的对象的 runtime_class 指针。pparam:传递给工作线程函数 pfnthreadproc 的参数。npriority : 线程的优先级。如果为0 ,则与创建它的线程优先级相同。可以通过参考win32programmer sreference 中的 setthreadpriority 得到所有可用的优先级列表和描述。nstacksize : 以字节为单位指定新线程的堆栈大小。如果为0 ,则与创建它的线程的堆栈大小相同。dwcreateflags :指定一个额外的标志控制线程的产生。它可以包括下面两个值中的一个:create_suspended :以挂起模式开始线

4、程,并且指定挂起次数.当调用resumethread 时,这个线程才会被执行。:创建之后,马上执行线程lpsecurityattrs :指向 security_attributes 结构的指针,结构中指定了线程的安全属性。如 果为 null ,则与创建它的线程的安全属性相同。如果希望得到更多的有关security_attributes 结构的信息 ,请参考 win32programmer sreference 。注释:调用这个函数创建一个新的线程。第一种形式的 afxbeginthread 创建一个工作线程;第二种形式创建一个用户接口线程。afxbeginthread 创建一个新的 cwint

5、hread 对象 ,调用它的createthread 函数开始执行线程并且返回指向线程的指针。checksaremadethroughouttheproceduretomakesureallobjectsaredeallocatedproperlyshouldanypartofthecreationfail. 终止线程,可以在线程函数中调用 afxendthread, 或者从工作线程的函数中返回。了解更多的有关afxbeginthread 的信息,可以参考文章multithreading:creatingworkerthreads 和sguide.multithreading:creating

6、user-interfacethreadsinvisualc+programmer参看: afxgetthread示例:创建一个工作线程:uintworkforce(lpvoidlpparameter);/ 线程函数声明cwinthread*pmyfirstworker , *pmysecondworker;lpvoidpparam=null;intnpriority=thread_priority_above_normal;/ 默认为 thread_priority_normaluintnstacksize=0;/ 与创建它的线程堆栈大小相同dworddwcreateflags=0;/ 创建

7、后立即执行lpsecurity_attributeslpsecurityattrs=null;/ 与创建它的线程安全属性相同pmyfirstworker=afxbeginthread(afx_threadproc)workforce,pparam,npriority,nstacksize,dwcreateflags,lpsecurityattrs);pmysecondworker=afxbeginthread(afx_threadproc)workforce,pparam);/如果采用默认值dwordwinapiworkforce(lpvoidlpparameter/ 线程所需参数,可以通过它

8、传递数据)return0;/ 什么不做cwinthread*afxbeginthread(cruntimeclass*pthreadclass,intnpriority=thread_priority_normal,uintnstacksize=0,dworddwcreateflags=0,lpsecurity_attributeslpsecurityattrs=null);参数说明 :pfnthreadproc: 线程函数的地址,该参数不能设置为null, 线程函数必须定义成全局函数或者类的静态成员函数例如 :uintmythreadfunc(lpvoidlparam)或者classapub

9、lic: staticuint_stdcallmythreadfunc(lpvoidlparam);之所以要定义成类的静态成员函数,是因为类的静态成员函数不属于某个类对象,这样在调用函数的时候就不用传递一个额外的 this 指针 .pthreadclass: 指向从 cwinthread 派生的子类对象的 runtime_classpparam: 要传递给线程函数的参数npriority: 要启动的线程的优先级,默认优先级为thread_priority_normal( 普通优先级),关于线程优先级的详细说明请参考platformsdksetthreadpriority 函数说明nstacks

10、ize: 新线程的堆栈大小,如果设置为0,则使用默认大小,在应用程序中一般情况下线程的默认堆栈大小为1mdwcreateflags: 线程创建标志,该参数可以指定为下列标志create_suspended: 以挂起方式启动线程,如果你在线程启动之前想初始化一些cwinthread类中的一些成员变量比如 :m_bautodelete 或者你的派生类中的成员变量,当初始化完成之后,你可以使用cwinthread 类的 resumethread成员函数来恢复线程的运行如果把该标志设置为 0, 则表示立即启动线程lpsecurityattrs: 指向安全描述符的指针 ,如果使用默认的安全级别只要讲该参

11、数设置为 null 就可以了 !上面就是 afxbeginthread 函数的简单说明 ,我们在使用的时候一般情况下只要指定前两个参数,其他参数使用默认值就可以 .嗯,的确 ,使用起来是很简单,只要这个函数一被调用,就创建了一个线程.但是大家有没有想过,afxbeginthread函数究竟是如何启动的线程呢?它的内部是如何实现的呢?下面我们就来看一下afxbeginthread函数的内部实现/ 启动 worker 线程cwinthread*afxapiafxbeginthread(afx_threadprocpfnthreadproc,lpvoidpparam,intnpriority,uin

12、tnstacksize,dworddwcreateflags,lpsecurity_attributeslpsecurityattrs)#ifndef_mtpfnthreadproc;pparam;npriority;nstacksize;dwcreateflags;lpsecurityattrs;returnnull;#elseassert(pfnthreadproc!=null);cwinthread*pthread=debug_newcwinthread(pfnthreadproc,pparam);assert_valid(pthread);if(!pthread-createthrea

13、d(dwcreateflags|create_suspended,nstacksize, lpsecurityattrs)pthread-delete();returnnull;verify(pthread-setthreadpriority(npriority);if(!(dwcreateflags&create_suspended)verify(pthread-resumethread()!=(dword)-1);returnpthread;#endif/!_mt)/ 启动 ui 线程cwinthread*afxapiafxbeginthread(cruntimeclass*pthread

14、class,intnpriority,uintnstacksize,dworddwcreateflags,lpsecurity_attributeslpsecurityattrs)#ifndef_mtpthreadclass;npriority;nstacksize;dwcreateflags;lpsecurityattrs;returnnull;#elseassert(pthreadclass!=null);assert(pthreadclass-isderivedfrom(runtime_class(cwinthread);cwinthread*pthread=(cwinthread*)p

15、threadclass-createobject();if(pthread=null)afxthrowmemoryexception();assert_valid(pthread);pthread-m_pthreadparams=null;if(!pthread-createthread(dwcreateflags|create_suspended,nstacksize, lpsecurityattrs)pthread-delete();returnnull;verify(pthread-setthreadpriority(npriority);if(!(dwcreateflags&creat

16、e_suspended)verify(pthread-resumethread()!=(dword)-1);returnpthread;#endif/!_mt从上面的代码中可以看出 afxbeginthread 所做的事情主要有以下几点 :1 . 在heap 中配置一个新的 cwinthread 对象 (worker 线程 )代码如 :cwinthread*pthread=debug_newcwinthread(pfnthreadproc,pparam);调用 cruntimeclass 结构中的 createobject 函数创建 cwinthread 对象cwinthread*pthrea

17、d=(cwinthread*)pthreadclass-createobject();cruntimeclass 以及 mfc 相关类的内部实现,详情请参考深入浅出 mfc 侯捷著2 .调用cwinthread:createthread() 并设定属性,使线程以挂起状态产生pthread-createthread(dwcreateflags|create_suspended,nstacksize,lpsecurityattrs);3 .设定线程的优先权pthread-setthreadpriority(npriority);4 .调用cwinthread:resumethreadpthread

18、-resumethread();afxbeginthread 和 createthread 具体区别具体说来, createthread 这个函数是windows 提供给用户的 api 函数,是 sdk 的标准形式,在使用的过程中要考虑到进程的同步与互斥的关系,进程间的同步互斥等一系列会导致操作系统死锁的因素,用起来比较繁琐一些,初学的人在用到的时候可能会产生不可预料的错误,建议多使用 afxbeginthread ,是编译器对原来的 createthread 函数的封装,用与mfc 编程(当然,只要修改了项目属性, console 和 win32 项目都能调用)而_beginthread 是

19、 c 的运行库函数。在使用 afxbeginthread 时,线程函数的定义为: uint_yourthreadfun(lpvoidpparam) 参数必须如此在使用 createthread 时,线程的函数定义为:dwordwinapi_yourthreadfun(lpvoidpparameter) 。两个的实质都是一样的,不过afxbeginthread 返回一个 cwinthread 的指针,就是说他会new 一个 cwinthread 对象,而且这个对象是自动删除的(在线程运行结束时),给我们带来的不便就是无法获得它的状态,因为随时都有可能这个指针指向的是一个已经无效的内存区域,所以使用时(如果需要了解它的运行状况的话)首先create_suspended 让他挂起,然后m_bautodelete=false ,接着才 resumethread ,最后不要了 delete 那个指针。creatthread 就方便多了,它返回的是一个句柄,如果你不使用 closehandle 的话就可以通过他安全的了解线程状态,最后不要的时候closehandle , windows 才会释放资源,所以我一般使用 creatthrea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论