MFC对多线程的支持.ppt

上传人:小飞机 文档编号:6512443 上传时间:2023-11-08 格式:PPT 页数:24 大小:283.51KB
返回 下载 相关 举报
MFC对多线程的支持.ppt_第1页
第1页 / 共24页
MFC对多线程的支持.ppt_第2页
第2页 / 共24页
MFC对多线程的支持.ppt_第3页
第3页 / 共24页
MFC对多线程的支持.ppt_第4页
第4页 / 共24页
MFC对多线程的支持.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《MFC对多线程的支持.ppt》由会员分享,可在线阅读,更多相关《MFC对多线程的支持.ppt(24页珍藏版)》请在三一办公上搜索。

1、第13章 多线程程序开发,Windows是一个多任务操作系统。在Windows中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。对于像通信程序这样既要进行耗时的工作,又要保持对用户输入响应的应用来说,使用多线程是最佳选择。当进程使用多个线程时,需要采取适当的措施来保持线程间的同步。本章首先简单介绍了多线程编程的必要性、进程、线程的基本概念,而后重点介绍Win32 API中有关线程的几个函数与结构和MFC对多线程的支持,最后介绍线程的通信与同步。,13.1 多线程的引入,很多初学者可能有这样的疑惑:程序为什么要使用多线程,什么时候应该使用多线程?本节将通过一个简单的例子说

2、明这个问题。,13.1.1 单线程程序的不足,在使用MFC开发应用程序时,可能会经常会有一些复杂的耗时很长的计算。这里给出一个简单的模拟程序,通过该程序很容易体会多线程程序设计的必要性。,13.1.2 问题的解决,对上节的程序,如果能够生成两个控制流程,一个负责其中的长时间处理过程即耗时计算,另外一个负责响应用户及系统消息,各司其职,则上述对话框的界面就会得到及时更新。如果一个程序能有多个控制流程,各个控制流程相互独立,并发执行,并且每个流程都有自己特有的任务,分工明确,则单个控制流程可能相对比较简单,但是多个控制流程并发执行将赋予应用程序强大的控制能力。多线程编程就是基于上述的思想而提出的,

3、在后面将详细介绍线程的基本概念及多线程编程的具体实现。,13.2 多线程编程的基础知识,本节主要介绍进程和线程的基本概念、以及Win32 API和MFC对多线程编程的支持。,13.2.1 进程和线程,在32位的Windows系统中,采用的是抢先式多任务,这意味着程序对CPU的占用时间是由系统决定的。系统为每个程序分配一定的CPU时间,当程序的运行超过规定时间后,系统就会中断该程序并把CPU控制权转交给别的程序。而与此相关的,有进程与线程两个重要概念。(具体内容请参照本书),13.2.2 Spy+工具,Visual Stadio提供了Spy+工具,通过它可以查看系统正在运行的进程和线程。在系统“

4、开始”“所有程序”“Microsoft Visual Stadio 6.0”“Microsoft Visual Stadio 6.0 Tools”下会发现Spy+工具。(具体内容请参照本书),13.2.3 Win32 API对多线程编程的支持,Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作,(具体内容请参照本书),13.3.4 MFC对多线程编程的支持,在MFC中,线程分用户界面线程和工作者线程两种。用户界面线程拥有自己的消息队列和消息循环来处理界面消息,可以与用户进行交互。工作者线程没有消息循环,一般用来完成后台工作。(具体内容请参照本书),13.3 多线

5、程程序开发,前面介绍了多线程程序开发的基础知识,在本节,将通过具体的实例讲解如何使用Win32 API函数开发简单的多线程程序以及MFC用户界面线程和工作者线程的开发。,13.3.1 使用Win32 API函数开多线程程序,对于简单的多线程程序设计,使用相关的Win32 API函数进行开发非常灵活。这里给出一个简单的实例,实例中通过创建3个线程控制对话框窗口中的3个进度条的运动。从实例的开发中,掌握线程的创建与终止操作。(具体内容请参照本书),13.3.2 MFC用户界面线程的开发,当程序中需要出现两个窗口,而其中均需要包含需要“实时”处理的信息时,就需要创建MFC用户界面线程。本节将实现一个

6、MFC用户界面线程的实例,其中主线程为基于单文档的MFC窗口,在客户窗口实时显示系统时间,而用户界面线程则创建一个非模式对话框,在其中通过进度条模拟一个耗时计算过程。通过本实例掌握MFC用户界面线程的开发过程。(具体内容请参照本书),13.3.3 MFC工作者线程的开发,MFC工作者线程一般用于耗时计算,正如13.1.1节介绍的那样,当程序需要进行耗时的运算时,往往对用户界面的操作得不到消息响应。这时就可以通过创建MFC工作者线程,将耗时计算单独放在一个新创建的线程中进行。(具体内容请参照本书),13.4 线程间的通信,通常,一个次要的线程为主线程执行一定的任务,这也暗示这在主线程和次要线程之

7、间需要有一个联系的渠道。有两种方法可以完成这些联系任务:使用全局变量或者使用自定义的消息。本节将介绍这两种方法。,13.4.1 使用全局变量实现线程间的通信,由于属于同一个进程的各个线程共享操作系统分配该进程的资源,因此解决线程间通信最简单的一种方法是使用全局变量。使用全局变量可以实现由主线程向工作线程“发送消息”。由于工作线程没有自己的消息循环,所以主线程不能向工作线程直接发送消息,这时可通过全局变量来实现。,13.4.2 使用自定义的消息实现线程间的通信,在上节介绍了使用全局变量,主线程可以建立与工作线程的通信,即控制工作线程的运行。反过来,工作线程如何与主线程建立联系呢?最简单的实现这种

8、联系的方法是在程序中使用自定义消息。,13.5 线程的同步,虽然多线程能给程序的开发设计带来很多便利,但是也有不少问题需要解决。使隶属于同一个进程的各线程协调一致地工作称之为线程的同步。MFC提供了多种同步对象,如CEvent、CCriticalSection、CSemaphore、CMutex等。另外,MFC也提供了线程同步辅助类CSingleLock和CMutiLock。通过这些类,可以比较容易地做到线程同步。,13.5.1 等待函数,在介绍MFC同步对象实现线程同步之前,首先介绍一下用于监测同步对象状态的等待函数。Win32 API提供了一组能使线程阻塞其自身执行的等待函数。这些函数只有

9、在作为其参数的一个或多个同步对象产生信号时才会返回。在超过规定的等待时间后,不管有无信号,函数也都会返回。在等待函数未返回时,线程处于等待状态,此时线程只消耗很少的CPU时间。(具体内容请参照本书),13.5.2 CEvent类实现线程同步,事件对象(Event)是最简单的同步对象,它包括有信号和无信号两种状态。在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适。例如,只有在通信端口缓冲区收到数据后,监视线程才被激活。,13.5.3 使用CEvent类实现线程同步实例,本节将给出一个使用CEvent类实现线程同步的具体实例。本实例通过读取一个字符串模拟读文件操作(Slee

10、p函数),在读到第10个字符时,启动一个工作线程,将字符串的小写字符转换为大写字符,即模拟写文件操作。显然,二者需要同步,即在用户读文件的过程中,虽然工作线程启动,但不能对数据进行操作,只有当读数据结束后,才能进行写操作。这里的同步就采用CEvent对象来实现。(具体内容请参照本书),13.5.4 CCriticalSection类实现线程同步,当多个线程访问一个独占性共享资源时,可以使用Critical Section(临界区)对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时

11、为止。因此,任一时刻,只有一个线程可以拥有临界区对象,而只有拥有临界区对象的线程才可以访问受保护的数据。(具体内容请参照本书),13.5.5 CCriticalSection类实现线程同步实例,本节给出一个使用CCriticalSection类实现线程同步的具体实例。实例创建两个工作线程分别实现读和写一个全局变量,通过使用CCriticalSection类对象,保证同一时刻只有一个线程可以访问临界区资源即全局变量。另外,通过本实例,掌握工作线程的创建和销毁操作。(具体内容请参照本书),13.5.6 CSemaphore类实现线程同步,使用信号量对象(Semaphore)也可以实现线程同步。信号量对象维护一个从0开始的计数,在计数值大于0时对象是有信号的,而在计数值为0时则是无信号的。通过使用信号量对象可用来限制对共享资源进行访问的线程数量。,13.5.7 CSemaphore类实现线程同步实例,本节给出一个使用CSemaphore类实现控制访问资源的线程数目的实例。实例中,通过CSemaphore对象设置允许访问保护对象的最大线程数目为2,用弹出提示对话框的形式模拟对保护对象的访问。通过本实例,掌握CSemaphore类的使用。(具体内容请参照本书),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号