第 9章 用机记录浏览器
9.0 本章概括
9.1 让计算机自动记录本身的工作时间
9.2 数据库及数据窗口对象
9.3 窗口设计
9.4 使用
本章介绍 一种使计算机能自动将每次开
机时间和关机时间存入磁盘文件并可随时进
行浏览, 统计的软件方法 。 这种做法相当于
在计算机内安装一个, 黑匣子,, 不管计算
机什么时候开关, 或做什么, 这个, 黑匣子,
始终会忠实的记录每次的开, 关机时间 。 尽
管它记录的信息很有限, 与真正意义上的黑
匣子相比有一定差距, 但对于 加强机器管理,
统计机器使用效率 具有 实际意义 。 尤其是采
用了利用 CMOS时钟电路内部的闲置寄存器
存储关机时间的关键技术, 对开发 CMOS时
钟电路的应用有参考意义 。 将汇编语言与
PowerBuilder开发工具结合, 开发应用软件,
也会使读者有所启发 。 在此基础上进一步做
一些工作, 有可能开发出更有应用价值的软
件或产品 。
9.1.1 自动记时的有关技术
9.1.2 将关机时间存入 CMOS实时钟寄存器
9.1.3 将上次关机时间和本次开机日期时间存盘
9.1.4 完整的源程序清单
9.2.1 应用程序对象, 数据库和表
9.2.2 数据窗口对象
9.3.1 窗口布局和控件
9.3.2 窗口及控件的编码
让计算机将本身每次工作的时间都
自动记录下来,对 加强机器管理, 减少
人工登记手续, 统计机器使用效率, 分
析机器技术性能 都是有意义的。要做到
这一点,只要将每次开机时间和关机时
间都自动记录下来就可以了。记录开机
时间非常容易。可以通过自动批处理,
执行一个特定的文件,将当前日期、时
间存入磁盘。甚至可以在自动批处理文
件中加一、两条命令来实现。但是,要
自动记录关机时间就不那么容易了。我
们可能会想到以下几种方法:
① ② ③ ④
关机之前让用户执行一个事先编
好的程序,将当前时间存盘 。这种
方法实际上是 手动 的,用户会感到
麻烦,极易疏漏 。
通过 修改 计算机的 定时中断 1CH
或 08H服务程序, 周期性的将当前
时间存盘 。 这种方法要 影响 到机器
的 效率, 在 技术 上也有一定 困难 。
对系统的 CMOS实时钟 设置报时
时间, 使之 周期性的产生中断, 并
通过 修改 50H或 4AH中断服务程序,
将当前时间存盘 。 这种方法也 不够
理想 。
有一种 比较理想 的方法是 利用
CMOS实时钟内部的闲置寄存器保
存关机时间 。 CMOS时钟内部有一
些数据寄存器和状态寄存器,它用
电池供电,关机后信息不会丢失。
其中有的数据寄存器是闲置不用的。
我们可以周期性地把当前时间存入
这些寄存器中,关机前最后一次存
入的时间,便可做为关机时间。待
下次开机时,将其取出存入磁盘。
此种方法精巧、高效,不会影响机
器的正常工作,也 比较简单 。
按照前面分析的技术路线,
将关机时间存入 CMOS时钟寄
存器, 要解决两个问题,一是
存到哪些寄存器中, 二是如何
周期性的自动保存当前时间到
指定的寄存器 。
CMOS实时钟电路的寄存器资
源十分有限, 不太容易找到空闲
的寄存器 。 但研究发现, 其中的
报时寄存器在一般情况下是闲置
不用的, 可以用它来存放关机时
间 ( 时, 分, 秒 ) 。 由于关机是
随机性的, 为了 保存关机时间,
必须要在关机前周期性的保存
,当前时间,, 被保存的最后一
个, 当前时间, 可近似的做为关
机时间 。 保存, 当前时间, 的周
期越短, 关机时间与最后一个
,当前时间, 的误差也越小 。
计算机系统的 08H号中断和
1CH号中断在系统定时器的控制
下, 每隔 55毫秒发生一次, 也就
是说, 这两个中断服务程序每隔
55毫秒就自动被执行一次 。 根据
这一特性, 可以通过修改 1CH号
中断服务程序, 使其每执行一次,
都将, 当前时间, 存入 CMOS实
时钟的报时寄存器一次, 这样,
就可以保证关机时间与关机前最
后一次保存的, 当前时间, 的误
差不超过 55mS。 尽管每 55毫秒
就要保存一次当前时间, 但由于
是寄存器存储操作, 速度极快,
对机器的正常工作毫无影响 。
修改 1CH号中断服务程序并
使中断服务程序驻留内存, 用高
级语言显然不合适, 因为会浪费
大量的存储空间和执行时间, 而
用汇编语言完成这项工作则恰如
其分 。 只要将下面这段汇编语言
程序添加到原 1CH号中断服务程
序中, 设置中断向量后, 每 55
毫秒就自动被执行一次, 将当前
时间存入 CMOS报时寄存器 。
程序用系统 1AH号中断的 2号
功能读取当前实时间, 得到 BCD码
形式的时, 分, 秒分别在 CPU内部
寄存器 CH,CL和 DH中 。 用 OUT
指令将 01输出到 70H 号端口
( COMS索引寄存器地址 ), 则
71H号端口对应的是秒报时寄存器,
用 OUT指令可将当前秒存入该寄存
器 。 类似地, 将 03输出到 70H号端
口, 则 71H号端口对应的是分报时
寄存器, 用 OUT指令可将当前分存
入该寄存器 。 将 05输出到 70H号端
口, 则 71H号端口对应的是时报时
寄存器 。
在硬盘 C 区的根目录下事先建立一个记时
文件 TIMERCD.SYS,用来存放每次开机日期
时间和关机时间 。 该文件建立时内容为空, 以
后每开机一次都由程序自动追加一组 22个字节
的数据, 其格式为:
...........hhmmss 上次关机时, 分, 秒 (各两
位 ),行末回车换行码占两字节
YYYYMMDDhhmmss 本次开机年,
月, 日, 时, 分, 秒 ( 年四位, 其它各两位 )
该文件内容是纯文本 。
这个 TIMERCD.SYS文件的第一行表示
开机日期是 2001年 12月 20日, 开机时间是
22时 16分 26秒, 关机时间是 22时 24分 48秒,
第二行表示开机日期是 2001年 12月 21日,
开机时间是 20时 54分 06秒, 关机时间是 21
时 25分 10秒,,.....,最后一行表示开机日期
是 2002年 02月 14日, 开机时间是 19时 02分
25秒, 目前尚未关机 。 下次开机时, 会把本
次关机时间和下次开机日期时间添加到文件
末尾 。
随着时间的推移, 文件中的数据不断积
累 。 可随时提取这些数据进行浏览, 整理,
加工, 统计用机时数, 开机次数等 。 特别是
将这些内容导入数据库, 在 Windows下使
用更加方便 。 这一部分工作由高级语言, 尤
其是 PowerBuilder来做就比较合适 。 将上
次关机时间和本次开机日期时间存盘仍用汇
编语言实现,在这段程序中定义了与文件路
径关联的 ASCIIZ串和两个数据缓冲区变量 。
首先指针指向关机时间缓冲区, 用
OUT指令将 05输出到 70H号端口, 以选定
71号端口的时报时寄存器, 用 IN指令从
CMOS电路的 71号端口输入上次关机的时
数, 调用子程序将其转换为 ASCII码后,
放到数据缓冲区 。 用类似的方法取出上次
关机的分, 秒数, 转换为 ASCII码后, 依
次放到数据缓冲区 。
然后, 指针指向开机日期时间缓冲
区, 用 1AH号中断的 4号功能取出系统当
前日期, 年的高两位在寄存器 CH,低两
位在寄存器 CL中, 月, 日分别在寄存器
DH和 DL中, 用 1AH号中断的 2号功能取
出系统当前时间, 时, 分, 秒分别在寄
存器 CH,CL和 DH中, 转换为 ASCII码
后, 依次放到数据缓冲区 。
最后, 用 21H号中断的 3DH号功能
按, 写, 方式打开指定的文件, 移动
读写指针到文件尾, 将上次关机时间
和本次开机日期时间依次存入文件后
关闭 。
以上两部分可以合并到一个汇编语
言程序当中,完整的源程序清单如下:
第一部分
功能,⑴修改 1CH号中断向量
⑵新的 1CH中断服务程序将当前时
间存入 CMOS寄存器中
第二部分
功能,⑴取上次关机时、分、秒;
⑵取本次开机日期、时间;
⑶存入 c:\timercd.sys 。
将源程序用任意文本编辑器输入之后存
到磁盘文件, 命名为 JS.ASM。 经汇编, 连
接形成扩展名为 EXE的可执行文件, 再用
EXE2BIN.COM转换为扩展名为 COM的文件
JS.COM。 JS.COM一旦执行, 随即将保存
在 CMOS寄存器中的上次关机时, 分, 秒和
本次开机的日期时间存入 C区根目录的文件
TIMERCD.SYS,同时修改 1CH号中断向量,
并将新的 1CH号中断服务程序驻留内存, 这
样便周期性地将当前时间存入 CMOS寄存器 。
为使整个工作不用人为干预完全自动进行,
需要在自动批处理文件中添加一行命令:
JS
同时,要将 JS.COM和 TIMERCD.SYS两个
文件拷贝到 C区根目录。
有了 TIMERCD.SYS文件 和其中的用机记
录, 可 以 把 它 导 入 数 据 库, 然 后 利 用
PowerBuilder强大的数据库操作能力, 对信
息进行浏览, 查询和统计, 加工等处理 。 先建
立一个文件夹, trad”,打开工作空间, PB8
实例,PBW”,在该文件夹 trad中建立对象库
trad.pbl,目标 trad.pbt和应用程序对象 trad。
这里用到的数据源是 trad,数据库连接之后,
打开用机记录浏览器窗口 w_trad。 在 trad文件
夹中建立一个 Access 2002数据库 trad.mdb,
配置 ODBC数据源和 Profile文件, 数据源名和
profile名均使用 trad。 在数据库中建立一个用
于存储 TIMERCD.SYS内容的表, 取名为 trad
1,数据窗口对象布局
2,用机时长数据颜色控制
3,汇总信息的定义
建立一个如图 9.6所示的窗口, 保存到对
象库 trad.pbl中, 取名为 w_trad。 窗口的
Title属性设置为, 用机记录浏览器,, 窗口
类型为 main!,窗口初始状态为 normal!,取
消最大化复选标记, 图标为 Window!。 在窗
口上放置 7个掩码编辑框, em_1用来显示当
前时间, em_y1,em_m1,em_d1、
em_y2,em_m2,em_d2分别用来表示查
询的起始时间和截止时间的时, 分, 秒 。 6
个单选按钮 rb1~ rb_6用来设置 查询的时长
条件 和 输出结果的排序方式 。 复选框 cbx_1
用来设置查询时是否只显示冷启动记录 。 数
据窗口控件 dw_1与前面设计的数据窗口对
象 d_trad相连, 在其中显示用机记录信息和
统计结果 。 窗口上还有 5个命令按钮, 完成
相应的功能 。
1,窗口的 open事件和 timer事件代码
2,命令按钮, 单选按钮和复选框的编码
3,窗口用户事件 u_serch代码
4,将 timercd.sys文本文件的内容导入
数据库
用机记录浏览器设计, 调试完
成后, 编译成可执行文件, 就可以
发布到其它计算机进行使用了 。 整
个 系 统 包 括 文 件 JS.COM、
TIMERCD.SYS,TRAD.EXE、
TRAD.DB,PowerBuilder8.0 的发
布文件以及相关的数据库驱动程序 。
安装到其它机器上以后还要配置
ODBC 数据源, 并要在
AUTOEXEC.BAT文件中添加一条
命令 JS。
系统运行后, 在, 用机记录浏
览器窗口上单击, 更新, 按钮,如
果单击, 今天, 按钮, 系统会把
当天的用机记录筛选出来, 显示
出信息 。 如果将, 起始日期, 中
的月份数调整为, 01”, 再单击
,排序方式, 分组框中的, 时长,
单选按钮, 系统会把指定日期的
所有用机记录按, 用机时长, 升
序排列显示出来 。