操作系统进程管理演示系统开发(生产者消费者)毕业论文.doc

上传人:仙人指路1688 文档编号:3944021 上传时间:2023-03-28 格式:DOC 页数:77 大小:489.50KB
返回 下载 相关 举报
操作系统进程管理演示系统开发(生产者消费者)毕业论文.doc_第1页
第1页 / 共77页
操作系统进程管理演示系统开发(生产者消费者)毕业论文.doc_第2页
第2页 / 共77页
操作系统进程管理演示系统开发(生产者消费者)毕业论文.doc_第3页
第3页 / 共77页
操作系统进程管理演示系统开发(生产者消费者)毕业论文.doc_第4页
第4页 / 共77页
操作系统进程管理演示系统开发(生产者消费者)毕业论文.doc_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《操作系统进程管理演示系统开发(生产者消费者)毕业论文.doc》由会员分享,可在线阅读,更多相关《操作系统进程管理演示系统开发(生产者消费者)毕业论文.doc(77页珍藏版)》请在三一办公上搜索。

1、 本 科 生 毕 业 设 计(论文)( 2008 届)工程技术系题 目: 操作系统进程管理演示系统开发(生产者-消费者) 学生姓名: 学 号: 专业名称: 班 级: 指导教师 姓名: 系(部): 信息工程学院 职称: 副教授 2008年 5 月 16 日操作系统进程管理演示系统的研究与实现摘要:操作系统是计算机专业最重要的基础课程之一,其中同步问题是最难的部分。本文通过分析操作系统进程同步与互斥的问题,然后利用P,V操作实现进程同步与互斥,并利用该算法设计了生产者-消费者模拟演示系统。通过该演示系统展现进程的管理(生产者-消费者)可以用于操作系统的教学中。关键词:生产者-消费者问题;进程;同步

2、;互斥Research and Implementation of Process Management System DemonstrationAbstract: Computer operating system is one of the most important basic courses, and synchronization is one of the most difficult part. This paper will analyze the process of the operating system simultaneously with the problem

3、of mutual exclusion, and then using P, V synchronization achieving the operation about the process of mutually exclusive, and using the algorithm design of the producers - consumers mock demonstration system. Through the demonstration system about the process of management (producers - consumers) ca

4、n be used for the teaching of the operating system.Key words: producers; consumers; the process of synchronization,;mutex目录1 引言11.1 选题的意义11.1.1 开发系统的背景11.1.2开发系统的目的11.1.3 开发系统的意义21.2 P,V操作的简介21.2.1 P,V操作的介绍21.2.2 进程同步的实现31.2.3 进程互斥的实现31.3 生产者-消费者问题的描述31.3.1 问题的描述41.3.2 模型分析42 系统需求分析72.1 任务概述72.1.1 目

5、标72.1.2 运行环境72.1.3 编程工具72.2 演示系统的分析72.2.1 功能需求分析72.2.2 系统功能模块划分72.2.3 系统流程分析73 系统实现103.1 程序结构103.1.1生产者模拟函数代码103.1.2 消费者模拟函数代码113.2 MFC界面的设计123.2.1 MFC的介绍123.2.2 MFC界面效果143.3 系统功能的实现174 系统演示194.1 系统演示的准备194.2 系统演示的效果194.2.1 单生产者-单消费者模拟效果194.2.2 多生产者-多消费者模拟效果204.3 系统演示结论225 总结231 引言1.1 选题的意义 操作系统(简称O

6、S-operating system)是高等教育计算机应用专业教学计划中一门重要的专业基础课程。众所周知,计算机是各种信息系统的核心,CPU被喻为计算机系统的心脏,OS 被喻为计算机系统的大脑,是用户与计算机系统打交道的环境界面,心脏和大脑的紧密配合,才使计算机系统成为电子时代、信息社会无所不在的基础设施1。OS是在计算机原理与数据结构的基础上的一门提高性课程,是了解和掌握计算机应用系统的基础。其任务是了解操作系统的基本概念,理解计算机系统的资源(软件资源和硬件资源)如何组织,OS 如何有效地管理这些系统资源,用户如何通过OS与计算机系统打交道。通过学习OS可以进一步理解在计算机系统上运行的其

7、他各类OS并懂得在OS支持下建立自己的应用系统,因此OS是计算机应用的基础2。进程同步包括进程的互斥和进程的同步两个方面,是操作系统管理共享资源的一种手段.也是操作系统学习中的难点。操作系统教学中有最经典的四个同步、互斥问题为: 生产者消费者问题、哲学家进餐问题、理发师在空闲中的睡眠问题、读者作者问题, 深入地分析和理解这些问题, 对全面掌握同步、互斥问题大有益处,对学校操作系统这门课也有很重要的意义。1.1.1 开发系统的背景有关操作系统的教材大多注重理论,而绝大多数学习者一生都不可能参于操作系统的研究工作,他们需要的是对理论的理解和对实用系统的灵活应用。进程同步与互斥的实现是操作系统中的重

8、点内容,也是学习的难点部分。生产者-消费者问题是经典同步问题之一,不但在操作系统中很重要, 而且在分布式应用开发、实时数据库管理系统、CIMS 网络工程中都会遇到。但是以往人们只能从原理上加以理解, 没有直观的认识, 因而无法实际使用它。在现代操作系统UNIX、Windows 多进程环境下,我们将利用C语言实现多个生产者-消费者可视化同步运行。1.1.2 开发系统的目的操作系统是计算机学科中的一门重要课程。对于学习者来说, 进程的同步与互斥问题是个令人头痛的问题, 尤其是进程同步与互斥算法的实现, 更让人往往不知如何下手。本文通过具体实例, 给出了利用、操作解决进程同步与互斥问题的简单方法。在

9、操作系统教学过程中,因为部分教科书中对生产者和消费者问题的解释不够全面,学生在理解应用过程中经常出现一些问题。所以本文对生产者和消费者问题算法进行描述,利用操作系统进程管理演示系统(生产者-消费者)进行模拟演示。1.1.3 开发系统的意义采用信号量机制与PV操作来协调进程的同步, 一直是操作系统教学中的一个难点问题, 而且由它引出的一系列问题, 如: 生产者与消费者、读者与写者、哲学家进餐、理发师等问题都是很典型的进程同步与互斥问题。这类题型变化多、实例多,又与实际生活中的问题有着紧密联系3。“进程调度”涉及到操作系统的内核操作,原理性较强,也较为抽象,如只是依靠书本的文字和图形,学生理解起来

10、会很吃力。在操作系统课教学中,就引入了可视化设计帮助学生理解。操作系统进程管理演示系统(生产者-消费者)可以可视化的向学生展示进程调度,便于教学工作,提高学生的学习效率。1.2 P,V操作的简介1.2.1 P,V操作的介绍在操作系统中P,V操作是一种原语操作, 是不可分割的操作, 它要么执行完毕, 要么就不执行, 也就是说P,V操作一旦执行就不允许被中断, 直到执行完成为止。P,V操作主要通过对信号量的操作来实现对资源的控制, 从而控制进程的执行。信号量是和特定资源相对应的数据结构, 由整型数值和指针两部分所组成, 其中整型数值表示资源情况,只能由P,V操作来改变, 它有三种值:S0 表示当前

11、可用资源的数量;S0 其绝对值表示当前等待该类资源的进程数量;=0 表示当前没有可用资源也没进程等待该类资源。P 操作相当于申请资源, 进程在使用资源之前, 应先调用操作申请所须资源, 若资源申请被满足, 则进程可以继续执行, 否则进程将调用阻塞原语阻塞自己。P(S)的具体执行过程如下:S=S-1;若S0, 则进程继续执行;若S0, 则进程继续执行;若S0, 则调用唤醒原语唤醒等待该资源的进程, 原进程继续执行。 1.2.2 进程同步的实现进程同步是指为了共同完成某项任务, 具有伙伴关系的进程在执行时间次序上必须遵循确定的规律。多个进程为了共同完成任务, 须要按照一定的次序去执行, 各个进程在

12、执行时在时间上具有明显的先后次序, 即进程必须按照一定的顺序去执行。这和进程互斥明显不同。实现进程同步的关键在于当一个进程执行以后, 确定下一个将要执行的进程, 并用V操作使该进程可以执行。在实现时, 我们可以在各进程中完成特定功能的程序段两端加上P操作和V操作, 它们分别使用不同的信号量, 用以在各进程间传递信息。通常, 能够最先执行的进程中, P操作中所使用的信号量的初值大于, 而其它进程中, 第一个P操作所对应的信号量的初值为零。这样, 在执行时,第一个进程先执行, 执行完V操作后, 使另一个进程可以执行, 依次传递下去, 就可以实现各个进程按照一定的顺序执行了。1.2.3 进程互斥的实

13、现进程互斥是进程间由于竞争资源而产生的相互制约关系。对于多个使用同一资源的进程, 它们对于资源的竞争导致它们在执行时的异步性特征。竞争到资源的进程可以立即投入运行, 而没有竞争到资源的进程只能阻塞自己以等待资源。进程中用以访问这种被竞争的独占资源(临界资源)的程序段叫做临界区。要使多个进程不会同时访问临界资源, 只需要让它们在执行时不会同时执行临界区内的代码就可以了。因此我们可以在各进程的临界区的两端分别加入对于同一个初值为的1信号量的P,V操作, 就可以实现当一个进程进人临界区后, 其它进程不能够再进入临界区, 直到先前进人临界区的进程退出临界区后,通过V操作唤醒其它某个等待进程后, 才会有

14、进程再次访问临界资源, 从而实现多个进程对于临界资源的互斥访问。1.3 生产者-消费者问题的描述1.3.1 问题的描述设有若干个生产者进程P1, P2, P3,Pl; 若干个消费者进程C1, C2, C3,Cm, 它们通过一个由n 个缓冲区组成的有界缓冲池联系起来。每个缓冲区存放一个“产品”, 生产者进程不断地生产产品, 并把它们放入缓冲池内, 消费者进程不断地从缓冲池内取产品并消费之。这里既要求同步, 也需要恰当地互斥。同步存在于p、c 两类进程之间: 当缓冲池已放满了产品(供过于求) , 生产者进程必须等待; 当缓冲池已空( 供不应求) , 消费者应等待。互斥存在于所有进程之间, 各自需要

15、独占地使用缓冲区。1.3.2 模型分析1单缓冲区的单生产者-单消费者问题模型限制条件:整个系统仅有唯一的一个缓冲区,活动进程仅有一个生产者Producer 和一个消费者Consumer。进程关系分析:同步关系:只有在Producer 向缓冲区放入物品后,Consumer 才能够从缓冲区中取出物品消费;因此存在Consumer 对于Producer 的同步依赖。(2)只有在Consumer 从缓冲区取出物品后,Producer 才能够继续向缓冲区中放入新生产的物品;因此存在Producer 对于Consumer 的同步依赖。互斥关系:Producer 放入物品的同时,Consumer 是不能从缓

16、冲区中取出物品的;反之亦然。因此存在Producer 和Consumer 之间的互斥关系。2单缓冲区的多生产者-多消费者问题模型限制条件:整个系统仅有唯一的一个缓冲区,活动进程有n 个生产者Producer 和m 个消费者Consumer。进程关系分析同步关系:(1)对于任意的i(1in),j(1jm),只有在ProducerI 向缓冲区放入物品后,ConsumerJ才能够从缓冲区中取出物品消费;因此存在ConsumerJ 对于ProducerI的同步依赖。 (2)对于任意的i(1in),j(1jm),只有在ConsumerJ从缓冲区取出物品后,ProducerI才能够继续向缓冲区中放入新生产

17、的物品;因此存在ProducerI 对于ConsumerJ 的同步依赖。互斥关系:(1)对于任意的i(1in),j(1jm),ProducerI 放入物品的同时,ConsumerJ是不能从缓冲区中取出物品的;反之亦然。因此存在ProducerI 和ConsumerJ之间的互斥关系。 (2)对于任意的i(1in),j(1jn),ij,ProducerI 放入物品的同时, ProducerJ是不能放入物品的。因此存在ProducerI 和ProducerJ 之间的互斥关系。(3)对于任意的i(1im),j(1jm),ij, ConsumerI 从缓冲区中取出物品的同时,ConsumerJ 是不能从

18、缓冲区中取出物品的。因此存在ConsumerI 和ConsumerJ 之间的互斥关系。3多缓冲区的单生产者-单消费者问题模型限制条件:整个系统有K 个缓冲区,活动进程仅有一个生产者Producer 和一个消费者Consumer。进程关系分析同步关系:(1)只有在Producer 向缓冲区放入物品后,Consumer 才能够从缓冲区中取出物品消费;因此存在Consumer 对于Producer 的同步依赖。(2)只有在Consumer 从缓冲区取出物品后,Producer 才能够继续向缓冲区中放入新生产的物品;因此存在Producer 对于Consumer 的同步依赖。互斥关系:(1)对于任意的

19、i(1iK),j(1jK),ij,Producer 向空闲缓冲区BufferKi放入物品的同时,Consumer 可以从满缓冲区BufferKj中取出物品;反之亦然。因此Producer 和Consumer 之间不存在针对缓冲区的互斥关系。(2) 尽管Producer 和Consumer 之间不存在针对缓冲区的互斥关系,但由于Producer和Consumer 都需要在操作缓冲区的同时对缓冲区队列进行维护,缓冲区队列也就成为两者间新的临界资源,因此Producer 和Consumer 之间出现了针对缓冲区队列的互斥关系。4多缓冲区的多生产者-多消费者问题模型限制条件:整个系统有K 个缓冲区,活

20、动进程有n 个生产者Producer 和m 个消费者Consumer。进程关系分析同步关系:(1)对于任意的i(1 i n),j(1jm),只有在ProducerI 向缓冲区放入物品后,ConsumerJ 才能够从缓冲区中取出物品消费;因此存在ConsumerJ 对于ProducerI 的同步依赖。(2)对于任意的i(1in),j(1jm),只有在ConsumerJ 从缓冲区取出物品后,ProducerI 才能够继续向缓冲区中放入新生产的物品;因此存在ProducerI 对于ConsumerJ 的同步依赖。互斥关系:(1)对于任意的i(1in),j(1jm),s(1sK),t(1tK),st,

21、ProducerI 向空闲缓冲区BufferKs放入物品的同时,ConsumerJ 可以从满缓冲区BufferKt中取出物品;反之亦然。因此ProducerI 和ConsumerJ 之间不存在针对缓冲区的互斥关系。(2)对于任意的i(1in),j(1jn),ij,s(1sK),t(1tK),st,ProducerI 向空闲缓冲区BufferKs放入物品的同时,ProducerJ 是可以向另一空闲缓冲区BufferKt放入物品的。因此ProducerI 和ProducerJ 之间不存在针对缓冲区的互斥关系。(3)对于任意的i(1im),j(1jm),ij,s(1sK),t(1tK),st,Con

22、sumerI 从空闲缓冲区BufferKs中取出物品的同时,ConsumerJ 是可以从另一空闲缓冲区BufferKt 中取出物品的。因此ConsumerI 和ConsumerJ 之间不存在针对缓冲区的互斥关系。(4)对于任意的i(1in),j(1jn),ij,s(1sm),t(1tm),st,尽管ProducerI 和ProducerJ 之间、ConsumerS 和ConsumerT 之间、ProducerI 和ConsumerS 之间不存在针对缓冲区的互斥关系,但由于ProducerI、ProducerJ、ConsumerS 和ConsumerT 都需要在操作缓冲区的同时对缓冲区队列进行维

23、护,缓冲区队列成为所有进程间的新的临界资源,因此ProducerI 和ProducerJ 之间、ConsumerS 和ConsumerT 之间、ProducerI 和ConsumerS 之间出现了针对缓冲区队列的互斥关系。以上这四种情形是逐个包含关系,所以我们只要设计出能完成第四种条件下的生产者-消费者模拟系统。2 系统需求分析2.1 任务概述2.1.1 目标学生通过该演示系统能形象的看到进程的调度,以便能更加透彻的理解操作系统中消费者-生产者的同步互斥问题。2.1.2 运行环境操作系统:WINDOWS 98/2000/XP。2.1.3 编程工具编程工具:microsoft visual c+

24、。 Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。Visual C+6.0不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环

25、境。2.2 演示系统的分析2.2.1 功能需求分析1. 操作系统进程管理演示系统是采用动画和交互的方式对生产者-消费者问题进行演示、教学。2. 学生可以输入生产者,消费者的数量来进行不同情形的的演示。 2.2.2 系统功能模块划分 系统已经设定一个大小固定的缓冲池(缓冲池大小11),缓冲池可以实时的显示生产者生产情况和消费者的消费情况,同时用户可以设定生产者的数目来进行生产(生产者数目1-10);设定消费者的数目来进行消费(消费者数目1-10),由此系统可以模拟上面所描述的四种生产者-消费者模型,同时用户可以实时的停止生产者及消费者的动作,做到分步展示的效果,有效率的起到教学的作用。 2.2.

26、3 系统流程分析1.算法的设计 P,V原语是操作系统中定义的,通过对信号量控制从而实现进程间同步的最基本操作。采用P、V 原语解决生产者-消费者问题的算法描述4。采用P、V 原语解决生产者/ 消费者问题的算法如下: (1)信号量和互斥量的设置:设代表缓冲池中空白缓冲区和满缓冲区的信号量分别为Empty 和Full ,Empty 和Full 的初值分别为n (缓冲池中缓冲区数) 和0 。设两个互斥量MuxProducer 和MuxCustomer ,它们的初值都为1。(2) 生产者算法:采集生成数据; P( Empty) 申请一个空白缓冲;P (MuxPro2ducer)申请对空白缓冲资源独占使

27、用;找出一空白缓冲区,把数据拷贝到缓冲区;V(MuxPro2ducer)释放对空白缓冲资源独占使用;V(Full)产生一个满缓冲区。消费者算法:做好接收准备;P( Full)申请一个满缓冲;P(MuxCustomer)申请对满缓冲资源独占使用。找出一满缓冲区;把满缓冲区中数据拷贝到用户数据区。V (MuxCustomer) 释放对满缓冲资源独占使用;V(Empty)产生一个空白缓冲区进行数据处理。2.算法流程图入 口sem=sem-1 sem=sem-1S=0唤醒等待队列中的一个进程式返回或转进程调度 返回否是 图2.1 P操作流程图入 口sem=sem-1 sem=sem-1Sm_Paren

28、t; int temp=0;int t=0;while(pDlg-m_continue) DWORD temp=WaitForMultipleObjects(SIZE_OF_BUFFER,pDlg-m_hEmptySemaphore,FALSE,INFINITE);pDlg-m_PArraytemp=1;pDlg-m_PStrtemp=this-m_name;pDlg-InvalidateRect(CRect(17+temp*40,17,20+(temp+1)*40,200);srand( (unsigned)time( NULL ) ); t=rand()%5;t+=1;Sleep(t*75

29、0+500);pDlg-m_Arraytemp=1;pDlg-m_PArraytemp=0;pDlg-m_PStrtemp=;pDlg-InvalidateRect(CRect(17+temp*40,17,20+(temp+1)*40,200);srand( (unsigned)time( NULL ) ); t=rand()%10;t+=10;ReleaseSemaphore(pDlg-m_hFullSemaphoretemp,1,NULL);Sleep(t*100); this-ExitInstance();return CWinThread:Run();3.1.2 消费者模拟函数代码in

30、t CConsumerThread:Run() / TODO: Add your specialized code here and/or call the base classCPCDlg *pDlg;pDlg=(CPCDlg*)this-m_Parent; int temp=0;int t=0;CString str;while(pDlg-m_continue) DWORD temp=WaitForMultipleObjects(SIZE_OF_BUFFER,pDlg-m_hFullSemaphore,FALSE,INFINITE);pDlg-m_CArraytemp=1;pDlg-m_C

31、Strtemp=this-m_name;pDlg-InvalidateRect(CRect(17+temp*40,17,20+(temp+1)*40,200);srand( (unsigned)time( NULL ) ); t=rand()%5;t+=1;Sleep(t*750+500);pDlg-m_Arraytemp=0;pDlg-m_CArraytemp=0;pDlg-m_CStrtemp=;pDlg-InvalidateRect(CRect(17+temp*40,17,20+(temp+1)*40,200);srand( (unsigned)time( NULL ) ); t=ran

32、d()%10;t+=10;ReleaseSemaphore(pDlg-m_hEmptySemaphoretemp,1,NULL);Sleep(t*100); this-ExitInstance();return CWinThread:Run();3.2 MFC界面的设计3.2.1 MFC的介绍MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员

33、所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。1封装 构成MFC框架的是MFC类库。MFC类库是C+类库。这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下。(1)对Win32应用程序编程接口的封装用一个C+ Ob

34、ject来包装一个Windows Object。例如:class CWnd是一个C+ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C+ window object的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。(2)对应用程序概念的封装使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口,等等。MFC把许多类似的处理封装起来,替程序员完成这些工作。另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。文档是用户操作的数据对象,视图是数据

35、操作的窗口,用户通过它处理、查看数据。(3)对COM/OLE特性的封装OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。MFC的OLE类封装了OLE API大量的复杂工作,这些类提供了实现OLE的更高级接口。(4)对ODBC功能的封装以少量的能提供与ODBC之间更高级接口的C+类,封装了ODBC API的大量的复杂的工作,提供了一种数据库编程模式。2继承 首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中,最重要的类是CObject和CCmdTarget。CObject是MFC的根类,绝大多数MFC类是其

36、派生的,包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CwinThread;文档对象,基类是Cdocument,等等。程序员将结合自己的实际

37、,从适当的MFC类中派生出自己的类,实现特定的功能,达到自己的编程目的。3虚拟函数和动态约束 MFC以“C+”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口

38、。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的代码。本书将充分的展示MFC调用虚拟函数和消息处理函数的内幕,让读者对MFC的编程接口有清晰的理解。4MFC的宏观框架体系 如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等

39、等。为了支持对应用程序概念的封装,MFC内部必须作大量的工作。例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。总之,MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口,简化了Windows编程。同时,MFC支持对底层API的直接调用。MFC提供了一个Windows应用程序开

40、发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。MFC是C+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C+对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制13。3.2.2 MFC界面效果这是系统界面设计的截图: 图3.1 MFC界面界面上有2个静态文本,2个编辑框和7个按纽组成:1. 启动生产者按纽的代码:

41、void CPCDlg:OnPstar() UpdateData(true);this-m_continue=true;this-SetTimer(100,1000,NULL);if( this-m_np0&this-m_np11) m_sp.EnableWindow(false); CString str; for( unsigned i=0; im_np;i+) str.Format(P%d,i);this-m_PTi =new CProducerThread(this,str);this-m_PTi-CreateThread(CREATE_SUSPENDED);VERIFY(this-m_PTi-SetThreadPriority(THREAD_PRIORITY_IDLE);this-m_PTi-ResumeThread(); else MessageBox(生产者数目必须在1-10之间,出错了);2. 启动消费者按纽的代码:void CPCDlg:OnStartc() UpdateData(true); this-m_continue=true;

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号