MFC线程全解.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MFC线程全解

对于用户来说工作线程运行在后台。这就使得工作线程特别适合去等待一个事件的发生。 在MFC应用程序中,所有的线程都是由CWinThread对象来表示的; CWinThread是用户接口线程的基类,CWinApp就是CWinThread派生出来的,在编写用户接口线程时,也需要从CWinThread 类派生出自己的线程类; CWinThread同样是工作线程的基类,但在编写工作线程的时候,升值不必刻意地从CWinThread类派生出自己的线程类对象。用户可以调用MFC框架的AfxBeginThread帮助函数,会创建CWinThread对象。 在Win32API中不区分两种线程,它只需要知道线程的起始地址,就可以开始执行线程。 * * LOGO MFC下的多线程编程 作者:陈帅 2008年7月30日 一、MFC 支持的两种线程: 1. 用户界面线程 通常用于处理用户输入及响应用户生成的事件和消息,并独立地相应正在应用程序其他部分执行的线程产生的消息和时间,并包含一个消息泵(a Message Pump)。用户界面线程包含一个消息处理的循环,以应对各种事件。 2. 工作线程 工作线程适用于处理那些不要求用户输入并且比较消耗时间的其 他任务(如大规模的重复计算,网络数据的发送与接受)。 注意: 3.创建MFC的工作线程 (1).编程实现控制函数 一个工作线程对应一个控制函数。线程执行的任务都应编写在控制函数之中。编写实现工作线程的控制函数是创建工作线程的第一步。 控制函数的原型声明是:UNIT ControlFunctionName(LPVOID pParam); 其中, UNIT ControlFunctionName:是控制函数的名字,自定。 参数pParam:是一个32位指针值,是启动工作线程时,有调用的AfxBeginThread()函数传递给工作线程的控制函数的。这个值既可以是指向简单数据类型的指针,用来传递int之类的数值,也可是是指向包含了许多参数的结构体或其他对象的指针;甚至可以忽略它。 (2).创建并启动工作线程 在进程的主线程或其他线程中调用AfxBeginThread()函数就可以创建新的线程,并使线程开始运行。 AfxBeginThread()函数是MFC提供的帮助函数,有两个重载版本,区别在于使用的入口参数不同。一个用于创建并启动用户接口线程,一个用于创建并启动工作线程。 要创建并启动工作线程,必须采用如下的调用格式: CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); 参数pfnThreadProc:是一个指向工作线程的控制函数的指针,即控制函数的地址。创建工作线程是必须指定将在此线程内部运行的控制函数。 参数pParam:是一个指向某种类型的数据结构指针,执行本函数时,将把这个指针进一步传递给此线程的控制函数,使之成为线程控制函数的入口参数。 参数nPriority:通常设为0。 参数nStackSize:通常设为0。 参数dwCreateFlags :通常设为0。 参数dwCreateFlags :通常设为0。 参数lpSecurityAttrs:通常设为NULL。 (3)创建工作线程的例子 struct { int n; double* pD; }myData; myData ss;//定义了该类型的变量,对该变量的初始化的代码省略了 UNIT MyCalcFunc(LPVOID pParam) { //如果入口函数为空指针,终止线程 if( pParam==NULL) AfxEndThread(MY_NULL_POINTTER_ERROR); int n=pParam-n; //数组元素个数; double* pD=pParam-pD; //指向数组的第一个元素; double sum=0; //数组元素之和; for(int i=0; in; i++) sum+=pD[i];//数组之和; CString bb; bb

文档评论(0)

ee88870 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档