概 述:本文提供了在DELPHI 6.0 环境下,用相关组件完成基于客户机/服务器(C/S)模型的统一网内微机系统时钟的一种方案,并围绕这一方案的完成实施了相应的编程技巧。
关键字:组件 统一 网络 时钟
一、问题的提出
在一些实时业务处理系统、分析系统和显示系统联网运行时,各系统微机的时钟需要保持精确一致,有的甚至要要精确到毫秒级,以保证各业务分系统的同步联网正常运行。这在没有提供联机校时服务的Windows系统之间靠人工参照校时几乎是无法完成的。因此只有依托现存的网络资源,通过制作自己的校时服务系统来解决这一问题。
二、解决方法
以一台时钟稳定且能方便准确校时的微机系统为基准,即作为时间服务器,运行时间服务系统,时间服务器能向时间客户端提供自己的准确时钟,作者在实践过程中,以一台具有GPS校时功能的WINDOWS 98系统微机(雷电探测系统)为时间服务器,该微机系统时钟十分准确稳定。在需要快速准确效时的微机系统上运行时间客户程序,时间客户程序能从时间服务器端获得服务器的准确时钟,并将该时间设置成本微机系统时间,从而达到准确统一网内时钟的效果,系统使用的核心组件为:Adjust_IdTimeServer(TidTimeServer类)和Adjust_IdTime(TidTime类)。这种基于客户机/服务器(C/S)模型的校时服务功能既可作为独立系统运行,也可作为相应业务系统的一项功能进行开发。
三、具体实现
为了方便阐述,下面以独立系统的方式介绍校时服务功能的实现办法。分为时间服务器端和校时客户端。
(1) 时间服务器端的实现
完成时间服务功能比较简单,主要是服务程序的管理。设计的时间服务程序启动后,其程序图标放于系统托盘中。在DELPHI6.0 IDE环境中,生成一个工程文件,在其主界面上放置两个组件:DaytimePopupMenu(TpopupMenu类)和Adjust_IdTimeServer(TidTimeServer类),其中DaytimePopupMenu只提供服务退出菜单选择功能,Adjust_IdTimeServer提供时间服务功能。以下是单元代码及部分注释。
unit DaytimeServer;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdDayTimeServer,
Menus,Shellapi, IdTimeServer;
Const
wm_icb=wm_user + 1000; //定义用户消息
type
TDaytimeform = class(TForm)
DaytimePopupMenu: TPopupMenu;
DaytimeExit: TMenuItem;
Adjust_IdTimeServer: TIdTimeServer;
procedure DaytimeExitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
TimeIcon:TNotifyIcondata;
procedure wmicb(Var msg:TMessage); Message wm_icb;
{ Private declarations }
public
{ Public declarations }
end;
var
DayTimeForm: TDaytimeform;
implementation
procedure TDayTimeForm.wmicb(Var msg:TMessage);
Var Mousepos:Tpoint;
begin
Case Msg.LParam of
wm_Lbuttonup: begin //弹出功能菜单
GetCursorpos(Mousepos);
DayTimePopupMenu.Popup(Mousepos.X,Mousepos.Y);
end;
end;
end;
{$R *.dfm}
procedure TDaytimeform.DaytimeExitClick(Sender: TObject);
begin
Application.Terminate //关闭时间服务系统
end;
procedure TDaytimeform.FormCreate(Sender: TObject);
begin
Adjust_IdTimeServer.Active:=True; //启动时间服务
TimeIcon.cbSize:=Sizeof(TNotifyIcondata);
//以下是当时间服务启动后,将应
TimeIcon.wnd:=handle; //用程序图标显示在系统托盘中
TimeIcon.uID:=1;
TimeIcon.uFlags:=nif_Message or nif_tip or nif_Icon;
TimeIcon.uCallbackMessage:=wm_icb;
TimeIcon.Sztip:='时间服务';
TimeIcon.hIcon:=Application.Icon.Handle;
Shell_NotifyIcon(nim_add,@TimeIcon)
end;
end.
(2) 校时客户端的实现
在DELPHI6.0 IDE环境中,生成一个新的工程文件,主界面设计如图一所示。
其中主要组件有:Adjust_IdTime(TidTime类)用于从时间服务器提取时间,Timer1(Ttimer类)用于实时显示系统当前时间,Adjust_Time_Btn(Tbutton类)完成与时间服务器校时,Ip_edit(Tedit类)用于服务器IP地址的编辑。以下是校时器单元代码及部分注释。
unit proof_time;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,StdCtrls,
ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdTime, ComCtrls;
type
TAdjust_Timeform = class(TForm)
Panel1: TPanel;
System_Time_Label: TLabel;
Data_Time_Label: TLabel;
Adjust_Time_Btn: TButton;
Esc_Btn: TButton;
Timer1: TTimer;
Adjust_IdTime: TIdTime;
Ip_edit: TEdit;
Adjust_time_StatusBar: TStatusBar;
procedure Esc_BtnClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Adjust_Time_BtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Adjust_Time_BtnMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Adjust_Timeform: TAdjust_Timeform;
implementation
{$R *.dfm}
procedure TAdjust_Timeform.Timer1Timer(Sender: TObject);
begin
System_Time_Label.Caption:=DateTimeToStr(Now); //实时显示系统当前时间
end;
procedure TAdjust_Timeform.Adjust_Time_BtnClick(Sender: TObject);
Var
System_Time:TSystemTime;
begin
If Ip_Edit.Visible then
begin
Ip_Edit.Visible:=False;
Adjust_time_StatusBar.Panels[1].Text:=Ip_Edit.Text;
end;
try
Adjust_IdTime.Host:=Ip_Edit.Text; //赋服务器IP地址
DateTimeToSystemTime(Adjust_IdTime.DateTime,System_Time);
SetLocalTime(System_Time);//将获得的时间设置成本地时钟,达到校时的目的
except //异常处理
Application.MessageBox('校时失败,请重新再试!','校时提示',0);
end;
end;
procedure TAdjust_Timeform.Esc_BtnClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TAdjust_Timeform.FormCreate(Sender: TObject);
begin
Ip_Edit.Visible:=False;
Adjust_time_StatusBar.Panels[1].Text:=Ip_Edit.Text;
end;
procedure TAdjust_Timeform.Adjust_Time_BtnMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button=mbRight then
Ip_Edit.Visible:=True; //当用右键击校时按钮时,IP编辑框显示可用
end;
end
四、应用说明 以上设计过程及单元代码都在DELPHI 6.0+PWIN98调试通过,生成的校时系统(含服务端和客户端)在基于IP的WINDOWS网络上运行良好,成为相关实时业务系统的一个很好的辅助工具。在应用过程中,将时间服务端软件运行于一台时钟稳定且有固定IP地址的系统中(时间服务端软件运行时,其程序图标位于于系统托盘中,左键点击可执行关闭操作)。在网络上其它系统上运行校时客户端软件,并将校时服务地址设为时间服务端IP地址,即可进行校时服务。
|