应用软件设计12.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
应用软件设计12

应用软件设计 第12讲: 多线程与消息 MFC程序中的多线程编程 进程(process)是指在系统中正在运行的一个应用程序。 线程(thread)是系统分配处理器时间资源的基本单元。 多任务是指操作系统可以同时支持多个进程同时运行,而每个进程又可以支持多个线程运行。 进程与线程的区别:每个进程都有私有的虚拟地址空间,进程的所有线程共享同一地址空间。 MFC程序中的多线程编程 线程被分为工作者线程(Worker Thread)和用户界面线程(User Interface Thread)两大类。 工作者线程:前者常用于处理后台任务,执行这些后台任务并不会耽搁用户对应用程序的使用,即用户操作无需等待后台任务的完成。 用户界面线程:用来独立的处理用户输入和相应用户的事件。其中用户界面线程的特点是拥有单独的消息队列,可以具有自己的窗口界面,能够对用户输入和事件做出响应。 工作者线程 要创建一个线程,需要调用函数AfxBeginThread。 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL); AFX_THREADPROC定义的函数: UINT MyControllingFunction( LPVOID pParam ); 工作者线程 暂停线程的执行: 当线程暂停执行的时候,也就是表示它放弃了执行的权力。操作系统会从等待运行的线程队列中选择一个线程来运行。新创建的线程就可以得到运行的机会。 可以使用函数Sleep: void Sleep( DWORD dwMilliseconds); //sleep time 以毫秒为单位 暂停当前线程指定时间间隔的执行。 用户界面线程 对于用户界面线程的创建有两种途径: 一、首先从CWinTread 类派生一个类(注意必须要用宏DECLARE_DYNCREATE 和IMPLEMENT_DYNCREATE 对该类进行声明和实现),然后调用函数AfxBeginThread 创建CWinThread 派生类的对象进行初始化启动线程运行; 用户界面线程 用函数AfxBeginThread创建用户界面线程 CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL ); 用户界面线程 二、通过构造函数创建类CWinThread的一个对象 然后由程序员调用函数::CreateThread来启动线程。通常类CWinThread的对象在该线程的生存期结束时将自动终止,如果程序员希望自己来控制,则需要将m_bAutoDelete设为FALSE。这样在线程终止之后类CWinThread对象仍然存在,只是在这种情况下需要手动删除CWinThread对象。 AfxBeginThread与CreateThread CreateThread()是Windows的API函数,线程优先级需由另一个函数确定; AfxBeginThread() 由MFC提供,有很多低级控制已经封装。 所以一般来说,尽量使用AfxBeginThread () 多线程的优先级 多线程创建后,就存在线程间优先级差异以及线程同步等问题。每个任务都具有相应优先级,优先级共有32级,从0到31,系统按照不同的优先级调度线程的运行。 其中0~15 级是普通优先级,线程的优先级可以动态变化。高优先级线程优先运行,只有高优先级线程不运行时,才调度低优先级线程运行。优先级相同的线程按照时间片轮流运行;16~30 级是实时优先级,实时优先级与普通优先级的最大区别在于相同优先级进程的运行不按照时间片轮转,而是先运行的线程就先控制CPU,如果它不主动放弃控制,同级或低优先级的线程就无法运行。 多线程的优先级 线程优先级 = 进程类基本优先级 ? 线程相对优先级 进程类的基本优先级有以下几种: 1) IDLE_PROCESS_CLASS 2) NORMAL_PROCESS_CLASS 3) HIGH

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档