软件工具与环境
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7、程序对MW_DESTROY的标准反 应是调用PostQuitMessage。
8、 PostQuitMessage没有什么操作, 只送出WM_QUIT消息,准备让消息 循环中的GetMessage获取此消息, 结束消息循环。
二、空闲时间的处理
1、空闲时间的概念
所谓空闲时间(idle time)是 指“系统中没有任何消息等待处 理”的时间。例如没有任何程序 使用定时器(timer,它会定时送 来WM_TIMER),使用者也没 有按键盘和鼠标或操作任何外设, 那么系统就处于所谓的空闲时间。
(1)shell调用CreateProcess激活 app.exe
(2)系统产生一个进程核心对象,计 数值为1。
(3)系统为此进程建立一个4GB地址 空间。
(4)加载器将必要的码加载到上述地 址空间中,包括app.exe的程序、数据, 以及所需的动态链接库(dlls).
(5)系统为此进程建立一个线程, 称为主线程(primary thread)。 线程才是CPU时间的分配对象。
(6)系统调用CRuntime函数库的 Startup code。 (7)Startup code调用app程序的 WinMain函数。
3、多线程多任务
在Win32系统中,执行一个程序, 必然会产生一个进程;当一个进程建 立后,主线程也产生了。多任务是指 系统可以同时运行多个进程,而每个 进程也可同时执行多个线程。一个程 序可以运行多个线程,每个线程独立 地执行程序代码中的一组语句。
四、进程与线程
通常用进程(process)表示一个执 行中的程序,并认为它是CPU调度单位。 事实上线程(thread)才是调度单位。
Windows 3.X都允许同时执行多 个程序。但分享CPU是程序的责任 (即应用程序具有对CPU的控制权)。 如果有一个程序不放弃CPU(许多程 序采用传统的消息循环,而拒绝与其它 程序共享资源),其它程序只有挂起而 无法响应操作。
2、Windows9X的抢先式多任务
操作系统能够强迫应用程序把 CPU分享给其它程序。即程序对CPU 的占用时间由系统控制,系统为每个 程序分配一定的CPU时间,当程序的 运行超过规定时间后,系统就会中断 该程序并把CPU控制权让给其它程序。
2、空闲时间的处理
空闲时间经常发生。后台工作最 适合在空闲时间完成。传统的SDK程 序如果要处理空闲时间,可以用下列 循环取代WinMain中的传统消息循环 (见图1)
原因是PeekMessage和 GetMessage的性质不同:它们都是从 消息队列中获取消息,如果没有消息, 程序的主执行线程(primary thread, 是一个UI执行线程)会被操作系统挂 起。当操作系统再次回来照顾这一执
4、程序不断进行上述2和3的操作。
5、当操作者按下系统菜单中的Close 命令项时,系统送出WM_CLOSE。 通常程序的窗口函数不拦截此消息, 于是DefWindowProc处理它。
6、DefWindowProc收到WM_CLOSE后 调用DestroyWindow把窗口清除。 DefWindowProc本身又会送出 WM_DESTROY。
软件工具与环境
第二章 多任务与多线程编程
一、Windows程序的生与死
在了解Windows程序的架构以及 它与Windows系统之间的关系后,对 Windows消息种类以及产生时机的透 彻了解,正是程序设计的关键。下面 以窗口的产生与死亡,说明消息的产 生与传递,以及应用程序的生与死。
1、程序初始化过程中调用 CreateWindow,为程序建立了一个窗 口,作为程序的屏幕舞台。 CreateWindow产生窗口之后会送出 WM_CREATE直接给窗口函数,后者于 是可以在此时做些初始化操作(例如 配置内存、打开文件、读初始数据等。
行线程时,发现消息队列中仍然是空 的,这时两个函数的行为就不同了:
(1)GetMessage会过门不入,于是 操作系统再去照顾其它程序。
(2)PeekMessage会取回控制权, 使程序得以执行一段时间。于是上 述消息循环进入OnIdle函数中。
三、 Windows的多任务
1、Windows3.X的协同式多任务
进程是应用程序的运行实例。每个 进程都有自己私有的虚拟地址空间。每 个进程都有一个主线程,但可以建立另 外的线程。进程中的线程是并行执行的, 各线程占用CPU的时间由系统决定。
线程是Windows9X/NT系统调 度分配CPU时间的基本单位。进程 至少有一个线程,也可以另外增加
线程。系统为每个线程分配一个 CPU时间片(约20ms),系统不停 地在各个线程之间切换。线程只有 在分配的时间片内才有对CPU的控 制权
2、在程序活着的过程中,不断以 GetMessage从消息队列中获取消息。 如果这个消息是WM_QUIT, GetMessage会返回0而结束while循环, 进而结束整个程序。
3、DispatchMessage通过Windows USER模块的协助和监督,把消息 分发给窗口函数。消息将在该处被 判别并处理。
Process对象不是用来执行程序代码 的;它只是一个数据结构,系统用它来 管理进程。程序代码的执行是线程的工 作。
2、进程的产生和死亡
执行一个程序,必然会产生一个 进程(process)。最直接的程序执行 方式就是在shell(如Windows 9X的 资源管理器)中用鼠标双击某一个可 执行文件图标(如为app.exe),运 行起来的app进程其实就是shell调用 CreateProcess激活的。整个执行流程 如下:
1、核心对象
核心对象是系统的一种资源,系 统对象一但产生,任何应用程序都可 以开启并使用该对Βιβλιοθήκη Baidu。系统给予核心 对象一个计数值作为管理之用。
核心对象包括下列几种:
(见图2)
这些核心对象的产生方式(使用 的API)不同,但都会获得一个handle 作为识别;每被使用一次,其对应的 计数值就增1。
核心对象的结束方式相当一致, 调用CloseHandle即可。