




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC全局函数AfxBeginThread及其与CreateThread的区别(2009-08-18 11:03:18) 转载标签: afxbeginthreadcreatethreadit分类: 技术 函数功能描述:创建新的线程函数原型:CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority =THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs = NULL );CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL,UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );返回值:指向新创建的线程对象。参数:pfnThreadProc:工作线程的函数指针,不可以为空。并且工作线程的函数必须如此声明: UINT MyControllingFunction( LPVOID pParam );pThreadClass: 从CWinThread类继承来的对象的RUNTIME_CLASS指针。pParam:传递给工作线程函数pfnThreadProc的参数。nPriority:线程的优先级。如果为0,则与创建它的线程优先级相同。可以通过参考Win32 Programmers Reference中的SetThreadPriority得到所有可用的优先级列表和描述。nStackSize: 以字节为单位指定新线程的堆栈大小。如果为0,则与创建它的线程的堆栈大小相同。dwCreateFlags:指定一个额外的标志控制线程的产生。它可以包括下面两个值中的一个: CREATE_SUSPENDED:以挂起模式开始线程,并且指定挂起次数.当调用ResumeThread时,这个 线程才会被执行。 0 :创建之后,马上执行线程。lpSecurityAttrs:指向SECURITY_ATTRIBUTES结构的指针,结构中指定了线程的安全属性。如果为NULL,则与 创建它的线程的安全属性相同。如果希望得到更多的有关SECURITY_ATTRIBUTES结构的信息,请参考Win32 Programmers Reference。注释:调用这个函数创建一个新的线程。第一种形式的AfxBeginThread创建一个工作线程;第二种形式创建一个用户接口线程。AfxBeginThread创建一个新的CWinThread对象,调用它的CreateThread函数开始执行线程并且返回指向线程的指针。Checks are made throughout the procedure to make sure all objects are deallocated properlyshould any part of the creation fail. 终止线程,可以在线程函数中调用AfxEndThread, 或者从工作线程的函数中返回。了解更多的有关AfxBeginThread的信息,可以参考文章Multithreading: Creating Worker Threads 和Multithreading: Creating User-Interface Threads in Visual C+ Programmers Guide.参看:AfxGetThread示例:创建一个工作线程:UINTWorkForce(LPVOID lpParameter);/线程函数声明CWinThread*pMyFirstWorker,*pMySecondWorker;LPVOIDpParam = NULL;int nPriority = THREAD_PRIORITY_ABOVE_NORMAL;/默认为THREAD_PRIORITY_NORMALUINT nStackSize = 0;/与创建它的线程堆栈大小相同DWORD dwCreateFlags = 0;/创建后立即执行LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ;/与创建它的线程安全属性相同pMyFirstWorker=AfxBeginThread( (AFX_THREADPROC)WorkForce, pParam, nPriority , nStackSize,dwCreateFlags , lpSecurityAttrs);pMySecondWorker=AfxBeginThread( (AFX_THREADPROC)WorkForce, pParam);/如果采用默认值DWORD WINAPI WorkForce( LPVOID lpParameter / 线程所需参数,可以通过它传递数据)return 0;/什么不做 CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);参数说明:pfnThreadProc:线程函数的地址,该参数不能设置为NULL,线程函数必须定义成全局函数或者类的静态成员函数例如:UINT myThreadFunc(LPVOID lparam)或者class Apublic:static UINT _stdcall myThreadFunc(LPVOID lparam);之所以要定义成类的静态成员函数,是因为类的静态成员函数不属于某个类对象,这样在调用函数的时候就不用传递一个额外的this指针.pThreadClass:指向从CWinThread派生的子类对象的RUNTIME_CLASSpParam:要传递给线程函数的参数nPriority:要启动的线程的优先级,默认优先级为THREAD_PRIORITY_NORMAL(普通优先级),关于线程优先级的详细说明请参考Platform SDK SetThreadPriority函数说明nStackSize:新线程的堆栈大小,如果设置为0,则使用默认大小,在应用程序中一般情况下线程的默认堆栈大小为1M dwCreateFlags:线程创建标志,该参数可以指定为下列标志CREATE_SUSPENDED:以挂起方式启动线程,如果你在线程启动之前想初始化一些CWinThread类中的一些成员变量比如:m_bAutoDelete或者你的派生类中的成员变量,当初始化完成之后,你可以使用CWinThread类的ResumeThread成员函数来恢复线程的运行如果把该标志设置为0,则表示立即启动线程lpSecurityAttrs:指向安全描述符的指针,如果使用默认的安全级别只要讲该参数设置为NULL就可以了!上面就是AfxBeginThread函数的简单说明,我们在使用的时候一般情况下只要指定前两个参数,其他参数使用默认值就可以.嗯,的确,使用起来是很简单,只要这个函数一被调用,就创建了一个线程.但是大家有没有想过,AfxBeginThread函数究竟是如何启动的线程呢?它的内部是如何实现的呢?下面我们就来看一下AfxBeginThread函数的内部实现/启动worker线程CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,int nPriority, UINT nStackSize, DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs)#ifndef _MTpfnThreadProc;pParam;nPriority;nStackSize;dwCreateFlags;lpSecurityAttrs;return NULL;#elseASSERT(pfnThreadProc != NULL);CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam);ASSERT_VALID(pThread);if (!pThread-CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,lpSecurityAttrs)pThread-Delete();return NULL;VERIFY(pThread-SetThreadPriority(nPriority);if (!(dwCreateFlags & CREATE_SUSPENDED)VERIFY(pThread-ResumeThread() != (DWORD)-1);return pThread;#endif /!_MT)/启动UI线程CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority, UINT nStackSize, DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs)#ifndef _MT pThreadClass; nPriority; nStackSize; dwCreateFlags; lpSecurityAttrs; return NULL;#else ASSERT(pThreadClass != NULL); ASSERT(pThreadClass-IsDerivedFrom(RUNTIME_CLASS(CWinThread); CWinThread* pThread = (CWinThread*)pThreadClass-CreateObject(); if (pThread = NULL) AfxThrowMemoryException(); ASSERT_VALID(pThread); pThread-m_pThreadParams = NULL; if (!pThread-CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize, lpSecurityAttrs) pThread-Delete(); return NULL; VERIFY(pThread-SetThreadPriority(nPriority); if (!(dwCreateFlags & CREATE_SUSPENDED)VERIFY(pThread-ResumeThread() != (DWORD)-1); return pThread;#endif /!_MT从上面的代码中可以看出AfxBeginThread所做的事情主要有以下几点:1.在heap中配置一个新的CWinThread对象(worker线程)代码如:CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam);调用CRuntimeClass结构中的CreateObject函数创建CWinThread对象CWinThread* pThread = (CWinThread*)pThreadClass-CreateObject();CRuntimeClass以及MFC相关类的内部实现,详情请参考深入浅出MFC侯捷著2.调用CWinThread:CreateThread()并设定属性,使线程以挂起状态产生pThread-CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,lpSecurityAttrs);3.设定线程的优先权pThread-SetThreadPriority(nPriority);4.调用CWinThread:ResumeThreadpThread-ResumeThread();AfxBeginThread和CreateThread具体区别 具体说来,CreateThread这个 函数是windows提供给用户的 API函数,是SDK的标准形式,在使用的过程中要考虑到进程的同步与互斥的关系,进程间的同步互斥等一系列会导致操作系统死锁的因素,用起来比较繁琐一些,初学的人在用到的时候可能会产生不可预料的错误,建议多使用AfxBeginThread,是编译器对原来的CreateThread函数的封装,用与MFC编程(当然,只要修改了项目属性,console和win32项目都能调用)而_beginthread是C的运行库函数。 在使用AfxBeginThread时,线程函数的定义为:UINT _yourThreadFun(LPVOID pParam)参数必须如此 在使用CreateThread时,线程的函数定义为: DWORD WINAPI _yourThreadFun(LPVOID pParameter)。 两个的实质都是一样的,不过AfxBeginThread返回一个CWinThread的指针,就是说他会new一个CWinThread对象,而且这个对象是自动删除的(在线程运行结束时),给我们带来的不便就是无法获得它的状态,因为随时都有可能这个指针指向的是一个已经无效的内存区域,所以使用时(如果需要了解它的运行状况的话)首先CREATE_SUSPENDED让他挂起,然后m_bAutoDelete=FALSE,接着才ResumeThread,最后不要了delete那个指针。 CreatThread就方便多了,它返回的是一个句柄,如果你不使用CloseHandle的话就可以通过他安全的了解线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学美术创意教学方案与课件设计
- 软件外包服务协议范文
- 四年级数学(四则混合运算)计算题专项练习与答案
- 青少年社会实践活动策划方案
- 文言文断句技巧与实战练习题
- 市场调研报告写作范文
- 生产流水线异常快速响应流程
- 体育心理技能训练测试题库
- Excel基础到高级操作全攻略
- 市场调研报告撰写规范与数据分析方法
- 小儿推拿进修总结汇报
- 2025公司应急预案演练计划(5篇)
- 医疗机构医院全员培训制度
- 2025仓库保管员试题及答案
- 生猪养殖场实施方案
- 矛盾纠纷化解培训课件
- 2025年成人高考语文试题及答案
- DB11-T 2103.14-2025 社会单位和重点场所消防安全管理规范 第14部分:电动汽车充电站
- 病毒感染课件
- 涉案财物处置培训
- 等离子切割机使用培训
评论
0/150
提交评论