- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十二章多线程
第十二章 多线程
当使用Windows 95或者其它现在比较流行的操作系统时,可以同时运行几个程序,这是大家都知道的。操作系统的这种能力称之为多任务处理。现今的许多操作系统也支持线程。一个应用程序能够创建几个线程。线程能够使你在多任务中进行多任务。一般的用户知道他能够在同一时刻运行多个程序,而编程者知道一个程序可以在同一时刻运行几个线程。在本章中,你将学会如何在你的程序中创建和管理线程。具体的说,包含以下内容:
??创建线程
??线程间通信
??线程同步
第一节 创建线程
线程就是操作系统分配处理器时间的最基本单元。在一个多线程的应用程序中,每一个线程都有它自己的堆栈,并且可以独立的操作在同一程序中运行的其它线程。MFC支持两种线程类型:用户接口线程和工人线程。前者有自己的消息泵,可以处理用户接口的任务,而后者则不能,它是最常用的线程。
一个应用程序至少有一个线程,即程序的基本或主线程。你可以根据需要启动和停止其它附加线程,但是一旦主线程停止了,整个程序就被关闭了。只要程序还在运行,主线程就在运行。
为了使用MFC创建一个线程,你所做的就是编写一个你希望的和程序的其它部分同时运行的函数,然后调用AfxBeginThread()来启动一个用以执行你的函数的线程。只要线程的函数在运行,线程就存活着,当线程函数结束时,线程就被销毁。
AfxBeginThread()函数如下所示:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam,int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0,DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass,int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0,DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
第一种形式用于创建工人线程,第二种线程用于创建用户接口线程。
这两种形式的函数的返回值是新创建的线程对象的指针。
参数意义如下:
pfnThreadProc:指向工人线程的控制函数的指针,它不能是NULL。
此控制函数必须声明成如下样式:
UINT MyControllingFunction( LPVOID pParam );
pThreadClass:从CWinThread派生的RUNTIME_CLASS
pParam:传递给工人线程的控制函数的参数
nPriority:线程的期望的优先权。如果这个值为0,则新线程和创建线程具有同样的优先级。
nStackSize:以字节为单位定义了新线程的堆栈大小。如果这个值为0,则新线程和创建线程具有同样大小的堆栈。
dwCreateFlags:控制线程创建的附加标志。这个值可以是以下两个值中的一个:CREATE_SUSPENDED和0。如果是标志是前者,以挂起数为1启动线程。只有在ResumeThread被调用时,这个线程才会被执行。如果标志为0,则在创建线程后立即执行线程。
lpSecurityAttrs:指向定义了线程安全属性的SECURITY_ATTRIBUTES结构的指针。如果为NULL,则新线程和创建线程具有同样的安全属性。
线程可能具有下面的优先级别:
THREAD_PRIORITY_ABOVE_NORMAL 比正常优先级高一个级别
THREAD_PRIORITY_BELOW_NORMAL 比正常优先级低一个级别
THREAD_PRIORITY_HIGHEST 比正常优先级高两个级别
THREAD_PRIORITY_IDLE 基本优先级为1。对于REALTIME_PRIORITY_CLASS进程,优先级为16。
THREAD_PRIORITY_LOWEST 比正常优先级低两个级别
THREAD_PRIORITY_NORMAL 正常优先级别
THREAD_PRIORITY_TIME_CRITICAL 基本优先级为15。对于REALTIME_PRIORITY_CLASS进程,优先级别是30。
一个线程的优先级决定了相对于其它正在运行的线程这个线程控制系统的时间。通常,线程的级别越高,它的运行时间也越长,这也正是THREAD_PRIORITY_TIME_CRITICAL如此高的原因。
下面用一个简单的例子说明如何创建线程,按照下面的步骤
文档评论(0)