操作系统多线程(张建华)
大学计算机基础课程教案

课程名称大学计算机基础教师姓名教师编号学年学期第一学期大学教务处制课程名称: 大学计算机基础课程性质: 公共基础课适用专业: 理工科各专业2005 2006.9.10 学生年级: 学期: 2006-2007第一期任课教师: 郭松涛编写时间:课程承担学院计算机学院教师所在学院计算机学院第1,~讲,4学时,,内容教案内容学时分配章节课堂教学 1. 标题,实验第,章计算机系统基础2. 教学目标及基本要求 , 了解计算机的发展、特点、分类及应用 , 理解计算机的工作原理 , 掌握计算机系统的硬件、软件系统组成, 理解计算机系统的层次结构, 掌握微机硬件各部分的特点作用3. 教学内容1.1 计算机的概述1.1.1 计算机的发展 ,,,1.1.2 计算机的特点 1.1.3 计算机的分类第1讲: 1.1.4 计算机的应用1.2 计算机的基本工作原理 1.1,1.21.2.1 存储程序控制原理 1.2.2 计算机的构成原理第2讲: 1.3 计算机系统的组成1.3.1 微型计算机的硬件组成 1.2,1.31.3.2 计算机软件系统1.3.3 计算机系统的层次结构4. 重点难点, 存储程序控制原理, 计算机的构成原理 , 计算机系统的层次结构5. 知识深化和拓宽 , 微型计算机硬件和软件的最新发展、最新外部设备使用的简介 , 当今计算机发展的最新技术介绍教学方式(手段)及教学过程中应注意的问题 6.理论讲解,实例教学, 计算机组成和工作原理的理解, 冯.若依曼原理的理解, 数制的表示和相互转换, 计算机硬件系统和软件系统, 计算机系统的层次结构7. 板书设计多媒体教学,使用PowerPoint文稿展示工具。
多媒体教学文件:,. 课程简介及教学参考书.ppt (33张幻灯片),. 第1章计算机系统基础.ppt (共127张幻灯片) 参考书部分幻灯片:参考书部分幻灯片:教学内容部分幻灯片:思考题和习题 8.1(教材习题,:1)题 , 4)题(1,3题必做) 课外作业 2(计算机等级考试样题练习(实验教程附录)第3讲,2学时,,内容 教案内容 学时分配 章节课堂教学 1(标题,实验第,章信息的表示2(教学目标及基本要求 , 了解信息在计算机中的表示方法 , 理解原码、反码、补码表示 , 理解定点数、浮点数、媒体信息的表示方法, 掌握数制的表示及二、八、十、十六进制的相互转换, 掌握为什么要进行信息编码及编码类别, 掌握二进制运算方法和逻辑运算方法, 理解计算机指令及指令系统3(教学内容2.1 信息在计算机内的表示2.1.1 数制及其转换2.1.2 数据在计算机中的表示2.1.3 常见的信息编码,,, 2.2 计算机运算基础2.2.1 算术运算基础2.2.2 逻辑运算基础2.3 计算机的指令和指令系统2.3.1 机器指令2.3.2 指令系统4(重点难点, 数制及其转换, 数据在计算机中的表示, 算术运算基础, 逻辑运算基础, 计算机的指令和指令系统5(知识深化和拓宽 , 介绍当今流行CPU的多线程、超线程指令处理过程的特点,今后发展的方向教学方式(手段)及教学过程中应注意的问题 6(以实例教学,如:进制转换、码制、二进制运算、等举例讲解, 数据在计算机中的表示, 强调程序、指令和程序流程(通过图形,比喻)板书设计 7(多媒体教学,使用PowerPoint文稿展示工具。
计算机07操作系统试题A-2010.6

内蒙古科技大学2009/2010学年第2学期学生班级________________学生学号:□□□□□□□□□□□□学生姓名:________________………………装订线………装订线………装订线…………试卷须与答题纸一并交监考教师…………装订线………装订线………装订线………………《操作系统》考试试题课程号:67111304 考试方式:闭卷使用专业、年级:计算机2007-1,2,3,4,5,6 任课教师:邢东旭考试时间:备注:一、单项选择(每题2分,共30分)1.在设计分时操作系统时,首先要考虑的是()A灵活性和可适应性 B交互性和响应时间C周转时间和系统吞吐量D 实时性和可靠性2.在OS中采用多道程序设计技术,能有效地提高CPU、内存和I/O 设备的()A灵活性B可靠性C兼容性D利用率3.已分配到除CPU外的所有资源的进程处于()状态A挂起B阻塞C就绪D执行4.为使进程从阻塞状态变为就绪状态应利用()原语(A)Block (B)suspend (C)active (D)wakeup5.对临界资源的排它性访问称为()A同步B互斥C调度D通讯6.用信号量S 实现对系统中4台打印机的互斥使用,若S.value的当前值为-1,则表示S.L队列中有()个等待进程(A)1 (B)2 (C)3 (D)47.()是CPU调度的基本单位,但不是资源分配的基本单位A程序B进程C线程D作业8.在面向用户的调度准则中,()是选择实时调度算法的重要准A响应时间快B平均周转时间短C截止时间的保证D优先权高的作业能获得优先服务9.下列算法中,()只能采用非抢占调度方式A高优先权优先法B时间片轮转法C FCFS调度算法D短作业优先算法10.下述解决死锁的方法中,属于死锁避免策略的是()A银行家算法B资源有序分配法C资源分配图化简法D撤销进程法11.在动态分区式内存管理中,每次分配时,把既能满足要求,又是最小的空闲区分配给进程的算法是()A最佳适应算法 B最坏适应算法 C首次适应算法D循环首次适应算法12.虚拟储存器管理系统的基础是程序的()A计算机的高速性B大容量的内存C循环性原理D局部性原理13.在请求分页系统的页表中增加了若干项,其中访问位供()参考A程序访问B置换算法C换出页面D调入页面14.在请求调页系统中选择自上次访问以来所经历时间最长的页面予以淘汰的算法称为()(A)FIFO算法(B)OPT算法(C)LRU算法(D)NRU算法15.下列磁盘调度算法中,平均寻道时间较短,但容易产生饥饿现象的是()(A)SSTF;(B)FCFS;(C)SCAN;(D)FSCAN二、填空题(每空1分,共30分)1.从资源管理的角度看,操作系统具有四大功能()()()();为了方便用户,操作系统还必须提供()2.现代操作系统的两个最基本的特征是()(),除此之外,它还具有()和()的特征3.进程由()()()组成,其中()是进程存在的唯一4.产生死锁的基本原因是()和进程推进顺序不当5.把作业装入内存中随即进行地址变换的方式称为();而在作业执行期间,当访问到指令和数据时才进行的地址变换的方式称为()6.分页系统中,页表的作用是实现()到()的转换7.在请求调页系统中,反复进行页面换进和换出的现象称为()8.通道是一种特殊的()9.磁盘属于()设备,其I/O控制主要采取()方式10.对文件空闲存储空间的管理,UNIX中采用()11.操作系统中采用缓冲技术的目的是为了增强系统( A )的能力,为了使多个进程能有效地同时处理输入和输出,最好使用( B )A:串行操作;并行操作;控制操作;中断操作B:缓冲池;单缓冲;双缓冲;循环缓冲12.磁盘的第二级容错技术SFT-II主要用于防止()和()的故障所导致的数据损坏,常用的措施有()和()13.OS向用户提供的接口有多种,通过(),用户程序可使用OPEN()来打开一个文件。
操作系统多线程课程设计

操作系统多线程课程设计一、课程目标知识目标:1. 理解操作系统中多线程的基本概念,掌握线程的创建、同步与通信机制;2. 学会分析多线程程序的性能与问题,了解常见线程同步问题的解决方案;3. 掌握操作系统级别线程调度的基本原则和方法。
技能目标:1. 能够运用所学知识,设计并实现简单的多线程程序;2. 能够运用同步机制,解决多线程中的竞态条件和死锁问题;3. 能够对多线程程序进行性能分析,并提出优化方案。
情感态度价值观目标:1. 培养学生对操作系统多线程技术的兴趣,激发他们探索计算机科学领域的热情;2. 培养学生团队合作意识,学会在团队项目中分工与协作;3. 培养学生面对复杂问题时的分析能力、解决问题的能力和创新精神。
课程性质:本课程为计算机科学与技术专业高年级选修课,旨在帮助学生深入理解操作系统中多线程技术,提高他们解决实际问题的能力。
学生特点:学生具备一定的编程基础和操作系统基本知识,具备独立分析和解决问题的能力。
教学要求:结合实际案例,注重理论与实践相结合,提高学生的动手能力和实际应用能力。
通过课程学习,使学生能够将多线程技术应用于实际项目中,提高软件性能。
二、教学内容1. 多线程基本概念:线程的定义、线程与进程的关系、线程的创建与销毁;2. 线程同步与通信:互斥锁、条件变量、信号量、管程等同步机制,线程间通信方式;3. 线程调度:调度算法、时间片轮转、优先级调度、多级反馈队列调度等;4. 多线程程序设计:多线程编程模型、线程池、线程局部存储、多线程并发控制;5. 常见线程同步问题及解决方案:竞态条件、死锁、饥饿、活锁等;6. 性能分析与优化:多线程程序性能指标、性能瓶颈分析、优化策略;7. 实践环节:结合实际案例,设计并实现多线程程序,分析并优化性能。
教学内容依据教材相关章节组织,具体安排如下:第一周:多线程基本概念,线程创建与销毁;第二周:线程同步与通信,互斥锁、条件变量、信号量等;第三周:线程调度,调度算法;第四周:多线程程序设计,线程池、线程局部存储;第五周:常见线程同步问题及解决方案;第六周:性能分析与优化;第七周:实践环节,课程总结与展示。
操作系统教程课后习题答案

操作系统1.什么是计算机系统?计算机系统是怎么构成的?了解PC的组成情况,说明:1)硬件组织的基本结构,画出硬件配置图;2)主要系统软件和应用软件(若有的话)他们的作用。
答:计算机系统就是按照人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的系统。
计算机系统由硬件子系统和软件子系统组成。
计算机系统的构成包括:如图1.2计算机硬件系统的构成:如图1.42.从功能以及程序涉设计的角度说明计算机系统中软件系统是如何构成的?答:分为系统软件,支撑软件和应用软件三层。
3.什么是操作系统?请举例说明操作系统在计算机系统中的重要地位。
答:操作系统是计算机系统中的一个系统软件,是一些程序模块的集合。
它们能以尽量有效、合理的方式组织和管理计算机的软硬件资源,合理的组织计算机的工作流程,控制程序的执行并向用户提供各种服务功能,使得用户能够灵活、方便、有效的使用计算机,使整个计算机系统能安全高效地运行4.请举一个实际的例子来说明操作系统的功能。
答:你能用用操作系统管理很多资源5.为什么说“操作系统是控制硬件的软件”的说法不确切?答:操作系统不仅能够控制硬件,也可以控制各种软件资源。
6.操作系统的基本特征是什么?说明他们之间的关系。
答:1.并发性2.共享性3.随机性7.试从独立性,并发性和交互性和实时性四个方面来比较批处理系统,分时系统以及实时系统。
答:分时系统:并发性是指同时有多个用户共同使用一个计算机,宏观上看是多个人同时使用一个CPU,微观上是多个人在不同时刻轮流使用CPU.独占性,是指用户感觉不到计算机为他们服务,就好像整个系统为他所独占。
交互性:是指用户根据系统响应结果进一步提出新要求,用户直接干预每一步。
实时性:是指系统对用户提出的请求及时响应。
8.引入多道程序设计技术的起因和目的是什么?多道程序系统的特征是什么?答:多道程序设计的基本思想在内存中保持多个作业,主机可以交替的方式同时处理多个作业,一般来说任何一道作业的运行总是要交替的使用处理器和外设子案9.多道程序设计的度是指在任一给定时刻,单个CPU所能支持的进程数目最大值。
操作系统罗宇版课后习题答案部分

操作系统罗宇版课后习题答案部分————————————————————————————————作者:————————————————————————————————日期:1。
2 操作系统以什么方式组织用户使用计算机?答:操作系统以进程的方式组织用户使用计算机.用户所需完成的各种任务必须由相应的程序来表达出来。
为了实现用户的任务,必须让相应功能的程序执行。
而进程就是指程序的运行,操作系统的进程调度程序决定CPU在各进程间的切换。
操作系统为用户提供进程创建和结束等的系统调用功能,使用户能够创建新进程.操作系统在初始化后,会为每个可能的系统用户创建第一个用户进程,用户的其他进程则可以由母进程通过“进程创建”系统调用进行创建。
1.4 早期监督程序(Monitor)的功能是什么?答:早期监督程序的功能是代替系统操作员的部分工作,自动控制作业的运行。
监督程序首先把第一道作业调入主存,并启动该作业。
运行结束后,再把下一道作业调入主存启动运行。
它如同一个系统操作员,负责批作业的I/O,并自动根据作业控制说明书以单道串行的方式控制作业运行,同时在程序运行过程中通过提供各种系统调用,控制使用计算机资源。
1。
7 试述多道程序设计技术的基本思想。
为什么采用多道程序设计技术可以提高资源利用率?答:多道程序设计技术的基本思想是,在主存同时保持多道程序,主机以交替的方式同时处理多道程序。
从宏观上看,主机内同时保持和处理若干道已开始运行但尚未结束的程序。
从微观上看,某一时刻处理机只运行某道程序。
可以提高资源利用率的原因:由于任何一道作业的运行总是交替地串行使用CPU、外设等资源,即使用一段时间的CPU,然后使用一段时间的I/O设备,由于采用多道程序设计技术,加之对多道程序实施合理的运行调度,则可以实现CPU和I/O设备的高度并行,可以大大提高CPU与外设的利用率.1。
8 什么是分时系统?其主要特征是什么?适用于哪些应用?答:分时系统是以多道程序设计技术为基础的交互式系统,在此系统中,一台计算机与多台终端相连接,用户通过各自的终端和终端命令以交互的方式使用计算机系统。
Win32多线程编程

(2)CloseHandle,用于关闭对象,其函数原型为: BOOL CloseHandle(HANDLE hObject);
如果函数执行成功,则返回 TRUE;否则返回 FALSE,我们可以通过 GetLastError 函数进一步可以获 得错误原因。
C 运行时库 在 VC++6.0 中,有两种多线程编程方法:一是使用 C 运行时库及 WIN32 API 函数,另一种方法是使 用 MFC,MFC 对多线程开发有强大的支持。 标准 C 运行时库是 1970 年问世的,当时还没有多线程的概念。因此,C 运行时库早期的设计者们不可能考 虑到让其支持多线程应用程序。 Visual C++提供了两种版本的 C 运行时库,-个版本供单线程应用程序调用,另一个版本供多线程应用程序 调用。多线程运行时库与单线程运行时库有两个重大差别: (1)类似 errno 的全局变量,每个线程单独设置一个; 这样从每个线程中可以获取正确的错误信息。 (2)多线程库中的数据结构以同步机制加以保护。 这样可以避免访问时候的冲突。
通过下列代码就可以遍历系统中的进程,获得进程列表:
//获取当前进程总数 EnumProcesses(process_ids, sizeof(process_ids), &num_processes);
//遍历进程 for (int i = 0; i < num_processes; i++)
{ //根据进程 ID 获取句柄 process[i] = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0,
2、获取进程信息 在 WIN32 中,可使用在 PSAPI .DLL 中提供的 Process status Helper 函数帮助我们获取进程信息。 (1)EnumProcesses()函数可以获取进程的 ID,其原型为:
操作系统罗宇课后习题答案

操作系统罗宇课后习题答案操作系统罗宇课后习题答案操作系统作为计算机科学中的重要课程,是计算机专业学生必修的一门课程。
学习操作系统的过程中,除了理论知识的学习,还需要通过习题来巩固所学内容。
本文将针对操作系统罗宇教材中的一些习题进行解答,帮助读者更好地理解和掌握操作系统的知识。
1. 什么是进程?进程的状态有哪些?进程是指在计算机系统中正在运行的一个程序。
它是操作系统进行资源分配和调度的基本单位。
进程的状态包括:- 就绪状态(Ready):进程已经具备运行的条件,等待系统分配资源。
- 运行状态(Running):进程正在执行指令。
- 阻塞状态(Blocked):进程由于等待某个事件的发生而暂停执行。
- 终止状态(Terminated):进程执行完毕或被操作系统终止。
2. 什么是线程?线程和进程的区别是什么?线程是进程中的一个执行流程,是操作系统调度和执行的基本单位。
一个进程可以包含多个线程,它们共享进程的资源。
线程和进程的区别主要有:- 资源开销:线程的创建、切换和销毁的开销较小,而进程的开销较大。
- 并发性:不同线程可以并发执行,共享进程的资源。
而不同进程之间的并发执行需要通过进程间通信来实现。
- 独立性:线程是进程的一部分,同一进程中的线程共享进程的地址空间和文件描述符等资源。
而不同进程之间是相互独立的。
- 启动方式:线程的创建和销毁由程序员控制,而进程的创建和销毁由操作系统控制。
3. 什么是死锁?如何避免死锁?死锁是指两个或多个进程因争夺资源而无法继续执行的状态。
死锁发生时,进程无法进行下去,系统资源被浪费。
为了避免死锁,可以采取以下策略:- 预防死锁:通过破坏死锁产生的四个必要条件(互斥、占有并等待、不可剥夺、循环等待)来预防死锁的发生。
- 避免死锁:通过资源分配策略,避免系统进入可能导致死锁的状态。
例如,银行家算法可以根据系统资源的最大需求进行资源分配,避免死锁的发生。
- 检测死锁:通过系统资源的状态和进程的状态来检测死锁的发生。
2015年辽宁省普通高等学校本科大学生计算机设计竞赛学生获奖名单

赵月
袁溪擎 王艺颖 张培
邱雅慧 金博 王守金
李放
二等奖 二等奖
宋省伟 国健男
邹鑫源 张颖烨 关天维 刘璐 沙建欣 茹雪
郭耸
二等奖
寇海莲 万正刚 二等奖 冯暖 任义 王剑辉 徐坤 姚翠莉 姚翠莉 杨玥 张辉 迟浩 二等奖 二等奖 二等奖 二等奖 二等奖 二等奖
孙伟超 王德飞 耿连庆 杜宇 罗威
祝享双 倪荣成 孙明飞 李郁蓉 张天书 门书颖 张策 张策 郑贻之 郑贻之
国玉霞 孙天祥 一等奖 喻春阳 霍楷 刘耘 一等奖 一等奖 吕秀辉 一等奖
杨彭剑 彭庆林 孙进进
第 2 页
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
“囧爱对对碰”益智小游戏 八角楼的夜 沧海蝴蝶 Our great future Rhythm of the city 可惜没如果 环保特工在行动(音乐) 那年那事儿 点唱机 有你的地方 Saber The Importance of Being Earnest 学生上网行为分析平台 生产线自动控制系统 多功能校园导游类游戏《校园 英雄》 智能蔬菜大棚控制系统 物联网中多汇聚节点拥塞控制 优化软件 太阳能红外线驱鸟器 移动输液系统开发 “寻医问药”在线挂号预约就 医应用 基于android的多功能闹钟 (Crazy Clock) 三维虚拟校园 SIE微校园
辽宁工业大学 辽宁师范大学 东北大学 东北大学 辽宁工业大学 辽宁工业大学 大连东软信息学院 东北大学 沈阳工程学院 沈阳师范大学 沈阳师范大学 辽宁科技学院 沈阳师范大学 沈阳工程学院 沈阳工学院 沈阳工学院 辽东学院 沈阳师范大学 沈阳工程学院 沈阳工学院 沈阳工程学院 沈阳师范大学 辽宁工程技术大学 沈阳工学院 沈阳工学院 辽宁师范大学 沈阳工学院 沈阳工程学院 辽宁工业大学 沈阳建筑大学 沈阳工学院 辽宁科技学院 大连东软信息学院
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西南交通大学程序设计报告西南交通大学多线程的实现之PI值计算年级:2009级信息学院学号:20092382姓名:张建华专业:软件工程2011年目录一设计目的 (3)二设计要求 (3)三设计过程 (3)3.1 自我学习过程 (3)3.2 程序实现过程 (3)四流程图 (8)五参考文献 (9)六附录 (9)6.1 主要代码 (9)6.2 主要界面 (11)一、设计目的通过设计计算PI值来实现并体会多线程,同时学会使用WIN32中关于多线程的几个基本函数.在这个过程中来加强学生对多线程相关知识的理解与掌握,学会如何对多线程进行创建、挂起、终止等。
同时,在熟悉Visual C++6.0的基础上,初步掌握MFC编程的一些用法,锻炼学生的实际编码能力。
二、设计要求1.通过正确计算PI值来体现多线程编程.2.要求在对话框中打印出当前PI的计算精度.3.有较友好的界面.三、设计过程1.自我学习过程因为之前从来没有用MFC写过程序,所以我在图书馆借了一本相关的书籍《VC++深入详解》,并一同借了该书的光盘。
这本书十分实用,我主要学习了该书的第一章(Windows程序运行原理)、第三章(MFC AppWizard 的原理与MFC程序框架的剖析)和第七章(对话框)。
通过相应章节的视频教学学会了一些基本的对话框操作。
学习过程中,我进一步明确了多线程的概念,即:多线程是操作系统支持在一个进程中执行多个线程的能力。
在同一个进程中的多个线程都共享同一片数据区,其中还涉及到一些变量的声明和使用。
并且,考虑到VC6.0中对一些Class Library的封装比较丰富,所以我使用了VC6.0来完成该设计。
首先应该明确WIN32中给我们提供了哪些多线程相关的函数,经过查阅和学习,我总结出一下几个:2.功能实现过程1)新建一个工程文件->新建->工程,选中MFC AppWizard[exe],工程名称为Pi_Value。
如图3.2.1所示。
图3.2.1 创建一个工程文件然后选择创建的应用程序类型为“基本对话框”,并确定。
2)界面设计向对话框中拖控件,并修改其属性。
静态文本框的属性可以不用修改,但是button控件的属性还是需要修改的,尤其是ID号,因为我们在实现功能的时候经常需要用到这些ID号。
界面如图3.2.2所示。
图3.2.2 界面设计3)代码实现在本例中,体现多线程的关键之处应该是当程序开始运算时, 用户可以随时暂停它,之后又可以恢复。
即用户可以点击“开始”来开始打印PI的值;通过“暂停”按钮来暂停打印;通过“继续”来继续显示;通过“结束”来结束显示并清空。
具体的实现如下。
i.创建一个线程:当用户按了开始按钮后,程序开始执行相关联代码,即创建计算PI值的线程:hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFuncPi, NULL,0,&ThreadID);该线程位于调用该函数的进程的虚拟地址空间内。
ii.挂起一个线程:当用户按暂停时即把当前线程用函数SuspendThread(…)挂起,此时线程的所有信息(线程上下文)被保存。
如:SuspendThread(hThread);iii.重启一个线程:当用户按下继续按扭时线程又被重启,此时这些的实现是通过函数ResumeThread(…)来完成的。
当然其中涉及到相关的参数传递问题,比如ResumeThread( )函数中带有一个HANDLE型参数,参数值为要重启的线程的句柄.到此时只解决了一部分问题,还有几个很重要的关键点.比如如何让运算出来的PI值打印在对话框的指定位置.这时用到MFC编程的知识比较多,比如对控件的操作等.此时用到的函数重要有(参数取自本实例):str.Format("%1d",e+d/a);m_Show.ReplaceSel(str,FALSE);SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_xs,st r1);iv.控件功能的实现:根据控件的属性名自动生成的相关函数需要我们去实现相关的功能。
下面给出函数名:void CPi_ValueDlg::OnStart()//关联“开始”控件{// TODO: Add your control notification handler code herehThread=CreateThread(NULL,0,ThreadFuncPi,NULL,0,NULL);/* BOOL EnableWindow(HWND hWnd,BOOL bEnable)函数:该函数允许/禁止指定的窗口或控件接受鼠标和键盘的输入,当输入被禁止时,窗口不响应鼠标和按键的输入,输入允许时,窗口接受所有的输入。
hWnd:被允许/禁止的窗口句柄。
bEnable:定义窗口是被允许,还是被禁止。
若该参数为TRUE,则窗口被允许。
若该参数为FALSE,则窗口被禁止。
*/GetDlgItem(IDC_Start)->EnableWindow(FALSE);GetDlgItem(IDC_Pause)->EnableWindow(TRUE);GetDlgItem(IDC_Goon)->EnableWindow(FALSE);GetDlgItem(IDC_End)->EnableWindow(TRUE);}void CPi_ValueDlg::OnPause();//关联“暂停”控件{// TODO: Add your control notification handler code hereSuspendThread(hThread);GetDlgItem(IDC_Start)->EnableWindow(FALSE);GetDlgItem(IDC_Pause)->EnableWindow(FALSE);GetDlgItem(IDC_End)->EnableWindow(TRUE);GetDlgItem(IDC_Goon)->EnableWindow(TRUE);}void CPi_ValueDlg::OnGoon();//关联“继续”控件{// TODO: Add your control notification handler code hereResumeThread(hThread); //线程恢复函数GetDlgItem(IDC_Start)->EnableWindow(FALSE);GetDlgItem(IDC_Pause)->EnableWindow(TRUE);GetDlgItem(IDC_End)->EnableWindow(TRUE);GetDlgItem(IDC_Goon)->EnableWindow(FALSE);}void CPi_ValueDlg::OnEnd();//关联“结束”控件{// TODO: Add your control notification handler code hereTerminateThread(hThread,-1);//该函数用来结束由hThread 参数指定的线程,并把dwExitCode设成该线程的退出码。
GetDlgItem(IDC_Start)->EnableWindow(TRUE);GetDlgItem(IDC_Pause)->EnableWindow(FALSE);GetDlgItem(IDC_End)->EnableWindow(FALSE);GetDlgItem(IDC_Goon)->EnableWindow(FALSE);m_Show.SetWindowText("");SetDlgItemText(IDC_xs,"");}v.求PI值函数功能并关联到静态文本框:该功能的代码如下。
DWORD WINAPI ThreadFuncPi(LPVOID lParam){CString str,str1;int Count=-1;int isfirst=1; //精确到7999位long a=10; //缩放的倍数long c=88000; //迭代的次数long f[88001]; //中间的计算结果long d; //内循环误差累计项long e=0; //外循环误差累计项long b, g; //分子与分母. k/(2k+1)int i;for(i=0;i<c;i++) f[i]=a*2/10;while(c>0){d=0;g=(c*2+1)-2; //分母部分b=c; // 分子while(1){d*=b;d+=f[b]*a;f[b]=d%g; // 带分数的分子部分d/=g; // 带分数的整数部分g-=2;b--;if(b==0) break;}/* 在编辑框中显示pi的值*/Sleep(10);str.Format("%1d",e+d/a);//格式化把long型数字转化为字符串类型/*CEdit::ReplaceSel void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE )函数:将编辑控件中的当前选定部分替换为文本;lpszNewText:指向一个以空终止的替换字符串. */m_Show.ReplaceSel(str,FALSE);if(isfirst){m_Show.ReplaceSel(".",FALSE); //打印小数点isfirst=0;}str1.Format("%d",++Count);SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_xs,str1);/* SetDlgItemText()函数:将计算的位数输出到小编辑框*/ //Count++;//itoa(Count,ch,10);//SetDlgItemText(IDC_xs,ch);e=d%a;c-=11; /* 因为精度固定为800位,每输出1位后,相当于精度需求降低了1位,所以每次可以少算11项*/ }return 0;}四、流程图五、参考文献[1] 孙鑫,余安萍著. VC++深入详解. 北京:电子工业出版社,2007[2] William Stalling著. 陈渝译. 操作系统——精髓与设计原理(第五版). 北京:电子工业出版社,2006六、附录1.本实例中的主要代码:DWORD WINAPI ThreadFuncPi(LPVOID lParam){CString str,str1;int Count=-1;int isfirst;long a=10; //缩放的倍数long c=88000; //迭代的次数long f[88001]; //中间的计算结果long d; //内循环误差累计项long e=0; //外循环误差累计项long b, g; //分子与分母. k/(2k+1)int i;for(i=0;i<c;i++) f[i]=a*2/10;while(c>0){ d=0;g=(c*2+1)-2; //分母部分b=c; // 分子while(1){ d*=b;d+=f[b]*a;f[b]=d%g; // 带分数的分子部分d/=g; // 带分数的整数部分g-=2;b--;if(b==0) break;}Sleep(10);str.Format("%1d",e+d/a);m_Show.ReplaceSel(str,FALSE);if(isfirst){m_Show.ReplaceSel(".",FALSE); isfirst=0;}str1.Format("%d",++Count);SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_xs,str1);//Count++;//itoa(Count,ch,10);//SetDlgItemText(IDC_xs,ch);e=d%a;c-=11; // 因为精度固定为800位,每输出1位后,相当于精度需求降低了1位,所以每次可以少算11项// SetDlgItemText(IDC_xs,ch);}return 0;}void CSystem32PiDemoDlg::OnPause(){ SuspendThread(hThread);GetDlgItem(IDC_Start)->EnableWindow(FALSE);GetDlgItem(IDC_Pause)->EnableWindow(FALSE);GetDlgItem(IDC_End)->EnableWindow(TRUE);GetDlgItem(IDC_Goon)->EnableWindow(TRUE);// TODO: Add your control notification handler code here}void CSystem32PiDemoDlg::OnGoon(){ ResumeThread(hThread);GetDlgItem(IDC_Start)->EnableWindow(FALSE);GetDlgItem(IDC_Pause)->EnableWindow(TRUE);GetDlgItem(IDC_End)->EnableWindow(TRUE);GetDlgItem(IDC_Goon)->EnableWindow(FALSE);// TODO: Add your control notification handler code here}void CSystem32PiDemoDlg::OnStart(){ //UpdateData();hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFuncPi,NULL,0,&ThreadID);GetDlgItem(IDC_Start)->EnableWindow(FALSE);GetDlgItem(IDC_Pause)->EnableWindow(TRUE);GetDlgItem(IDC_End)->EnableWindow(TRUE);GetDlgItem(IDC_Goon)->EnableWindow(FALSE);// TODO: Add your control notification handler code here}void CSystem32PiDemoDlg::OnEnd(){ TerminateThread(hThread,2);GetDlgItem(IDC_Start)->EnableWindow(FALSE);GetDlgItem(IDC_Pause)->EnableWindow(FALSE);GetDlgItem(IDC_End)->EnableWindow(FALSE);GetDlgItem(IDC_Goon)->EnableWindow(FALSE);// TODO: Add your control notification handler code here}2.本程序主要界面:图6.2.1 点击“开始”前图6.2.2 点击“开始“后图6.2.3 点击“暂停”后点击“继续”后备注:在这两个地方修改你的名字和学号哈。