你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
统一网内微机系统时钟的一种方案
 

  :本文提供了在DELPHI 6.0 环境下,用相关组件完成基于客户机/服务器(C/S)模型的统一网内微机系统时钟的一种方案,并围绕这一方案的完成实施了相应的编程技巧。

关键字:组件 统一  网络  时钟 

 

一、问题的提出

在一些实时业务处理系统、分析系统和显示系统联网运行时,各系统微机的时钟需要保持精确一致,有的甚至要要精确到毫秒级,以保证各业务分系统的同步联网正常运行。这在没有提供联机校时服务的Windows系统之间靠人工参照校时几乎是无法完成的。因此只有依托现存的网络资源,通过制作自己的校时服务系统来解决这一问题。

二、解决方法

以一台时钟稳定且能方便准确校时的微机系统为基准,即作为时间服务器,运行时间服务系统,时间服务器能向时间客户端提供自己的准确时钟,作者在实践过程中,以一台具有GPS校时功能的WINDOWS 98系统微机(雷电探测系统)为时间服务器,该微机系统时钟十分准确稳定。在需要快速准确效时的微机系统上运行时间客户程序,时间客户程序能从时间服务器端获得服务器的准确时钟,并将该时间设置成本微机系统时间,从而达到准确统一网内时钟的效果,系统使用的核心组件为:Adjust_IdTimeServerTidTimeServer类)和Adjust_IdTimeTidTime类)。这种基于客户机/服务器(C/S)模型的校时服务功能既可作为独立系统运行,也可作为相应业务系统的一项功能进行开发。

三、具体实现

为了方便阐述,下面以独立系统的方式介绍校时服务功能的实现办法。分为时间服务器端和校时客户端。

(1)       时间服务器端的实现

完成时间服务功能比较简单,主要是服务程序的管理。设计的时间服务程序启动后,其程序图标放于系统托盘中。在DELPHI6.0 IDE环境中,生成一个工程文件,在其主界面上放置两个组件:DaytimePopupMenuTpopupMenu类)和Adjust_IdTimeServerTidTimeServer类),其中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_IdTimeTidTime类)用于从时间服务器提取时间,Timer1Ttimer类)用于实时显示系统当前时间,Adjust_Time_BtnTbutton类)完成与时间服务器校时,Ip_editTedit类)用于服务器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调试通过,生成的校时系统(含服务端和客户端)在基于IPWINDOWS网络上运行良好,成为相关实时业务系统的一个很好的辅助工具。在应用过程中,将时间服务端软件运行于一台时钟稳定且有固定IP地址的系统中(时间服务端软件运行时,其程序图标位于于系统托盘中,左键点击可执行关闭操作)。在网络上其它系统上运行校时客户端软件,并将校时服务地址设为时间服务端IP地址,即可进行校时服务。
  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089