亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? nettimethread.pas

?? VC++實現的時間同步程序
?? PAS
字號:
{ ************************************************************************

   NetTime is copyrighted by Graham Mainwaring. Permission is hereby
   granted to use, modify, redistribute and create derivative works
   provided this attribution is not removed. I also request that if you
   make any useful changes, please e-mail the diffs to graham@mhn.org
   so that I can include them in an 'official' release.

  ************************************************************************ }

unit NetTimeThread;

interface

uses
  Windows, SysUtils, Classes, timewrap, unixtime, ntptime, ComObj,
    NetTimeCommon, NetTimeIPC, Winsock;

type

  TTimeThread = class;
  TTimeWatcher = class;

  TNetTimeServer = class(TNetTimeServerBase)
  private

    ttime: TTimeThread;
    ttwatch: TTimeWatcher;

    FActive: boolean;
    FServerCount: integer;
    FServers: TServerDefArray;
    FSyncFreq: integer;
    FLostSync: integer;
    FRetry: integer;
    FWarnAdj: integer;
    FServer: boolean;
    FOnStateChange: TNotifyEvent;
    FOnWarnAdj: TWarnAdjEvent;
    FOnExit: TNotifyEvent;
    FServerTime, FStationTime: TDateTime;
    FWarnAdjResult: boolean;
    FWantUpdateNow: boolean;
    FLastUpdateStatus: TSyncStatus;

    ServerIPC: TNetTimeIPCServer;

    RFC868_TCP_Thread: TRFC868_TCPServerThread;
    RFC868_UDP_Thread: TRFC868_UDPServerThread;
    NTP_Thread: TNTPServerThread;

    function GetServerStatus: TServerStatusBlock;
    procedure ExitNow;

  protected
    procedure DoStateChange;
    procedure DoWarnAdj;

  public
    function GetActive: boolean; override;
    function GetStatus: TSyncStatus; override;
    function GetLastUpdateTime: TDateTime; override;
    function GetStateChange: TNotifyEvent; override;
    procedure SetStateChange(const sc: TNotifyEvent); override;
    function GetWarnAdj: TWarnAdjEvent; override;
    procedure SetWarnAdj(const wa: TWarnAdjEvent); override;
    function GetOnExit: TNotifyEvent; override;
    procedure SetOnExit(const ex: TNotifyEvent); override;
    function GetServer: boolean; override;
    procedure SetServer(const sv: boolean); override;
    procedure SetConfig(const cfg: TServerConfigBlock); override;
    function GetConfig: TServerConfigBlock; override;
    procedure ForceUpdate; override;
    function UpdateNow: boolean; override;
    procedure KillEverything; override;
    procedure Start;
    procedure Stop;
    constructor Create;
  end;

  TTimeThread = class(TThread)
  public
    dttime: TDateTime;
    NowOfLastUpdate: TDateTime;
    StatusOfLastUpdate: TSyncStatus;
    MyOwner: TNetTimeServer;
    procedure SetDateTime(dDateTime: TDateTime);
    constructor Create(const Suspended: boolean);
    destructor Destroy; override;
  private
    update_rejected: boolean;
    time_retrieval_time: TDateTime;
  protected
    procedure Execute; override;
  end;

  TTimeWatcher = class(TThread)
  public
    synchronized: boolean;
    MyOwner: TNetTimeServer;
  protected
    procedure Execute; override;
  end;

implementation

uses iswinnt, timeconv, Registry, winerr, WinSockUtil;

constructor TNetTimeServer.Create;
begin
  inherited Create;
  FServerCount := 0;
  FSyncFreq := DefaultSyncFreq;
  FLostSync := DefaultLostSync;
  FRetry := DefaultRetry;
  FWarnAdj := DefaultWarnAdj;
  FServer := false;
  FOnStateChange := nil;
  FOnWarnAdj := nil;
end;

procedure TNetTimeServer.ForceUpdate;
begin
  // do nothing
end;

function TNetTimeServer.GetActive: boolean;
begin
  result := FActive;
end;

function TNetTimeServer.GetStateChange: TNotifyEvent;
begin
  result := FOnStateChange;
end;

procedure TNetTimeServer.SetStateChange(const sc: TNotifyEvent);
begin
  FOnStateChange := sc;
end;

function TNetTimeServer.GetWarnAdj: TWarnAdjEvent;
begin
  result := FOnWarnAdj;
end;

procedure TNetTimeServer.SetWarnAdj(const wa: TWarnAdjEvent);
begin
  FOnWarnAdj := wa;
end;

function TNetTimeServer.GetOnExit: TNotifyEvent;
begin
  result := FOnExit;
end;

procedure TNetTimeServer.SetOnExit(const ex: TNotifyEvent);
begin
  FOnExit := ex;
end;

procedure TNetTimeServer.SetConfig(const cfg: TServerConfigBlock);
begin
  FServerCount := cfg.ServerCount;
  FServers := cfg.Servers;
  FSyncFreq := cfg.SyncFreq;
  FLostSync := cfg.LostSync;
  FWarnAdj := cfg.WarnAdj;
  FRetry := cfg.Retry;
end;

function TNetTimeServer.GetConfig: TServerConfigBlock;
begin
  result.ServerCount := FServerCount;
  result.Servers := FServers;
  result.SyncFreq := FSyncFreq;
  result.LostSync := FLostSync;
  result.WarnAdj := FWarnAdj;
  result.Retry := FRetry;
end;

function TNetTimeServer.GetLastUpdateTime: TDateTime;
begin
  if FActive then
    result := (ttime as TTimeThread).NowOfLastUpdate
  else
    result := 0;
end;

function TNetTimeServer.GetStatus: TSyncStatus;

var
  i: integer;

begin
  if not FActive then
    begin
      result.Synchronized := false;
      for i := 0 to MaxServers-1 do
        result.ss[i] := ssUnconfigured;
    end
  else
    begin
      result.Synchronized := (ttwatch as TTimeWatcher).synchronized;
      result.ss := FLastUpdateStatus.ss;
    end;
end;

function TNetTimeServer.GetServer: boolean;
begin
  result := FServer;
end;

procedure TNetTimeServer.SetServer(const sv: boolean);
begin
  if (FServer = sv) then
    exit;
  FServer := sv;
  if FServer then
    begin
      RFC868_TCP_Thread := TRFC868_TCPServerThread.Create(false,RFC868_Port);
      RFC868_UDP_Thread := TRFC868_UDPServerThread.Create(false,RFC868_Port);
      NTP_Thread := TNTPServerThread.Create(false,NTP_Port);
    end
  else
    begin
      RFC868_TCP_Thread.Terminate;
      RFC868_UDP_Thread.Terminate;
      NTP_Thread.Terminate;
    end;
end;

function TNetTimeServer.GetServerStatus: TServerStatusBlock;
begin
  result.Config := GetConfig;
  result.Server := GetServer;
  result.Active := FActive;
  result.Status := GetStatus;
  result.LastUpdateTime := GetLastUpdateTime;
end;

procedure TNetTimeServer.ExitNow;
begin
  if Assigned(FOnExit) then
    FOnExit(Self);
end;

function TNetTimeServer.UpdateNow: boolean;
begin
  FWantUpdateNow := true;
  while FWantUpdateNow do
    sleep(GUISleepTime);
  result := FLastUpdateStatus.Synchronized;
end;

procedure TNetTimeServer.KillEverything;
begin
  ServerIPC.KillEverything;
end;

procedure TNetTimeServer.DoWarnAdj;
begin
  if Assigned(FOnWarnAdj) then
    FWarnAdjResult := FOnWarnAdj(Self,FServerTime,FStationTime)
  else
    FWarnAdjResult := ServerIPC.LargeAdjustWarn(FServerTime,FStationTime);
end;

procedure TNetTimeServer.DoStateChange;
begin
  if Assigned(FOnStateChange) then
    FOnStateChange(Self);
  ServerIPC.AdviseStatus;
end;

procedure TNetTimeServer.Start;

var
  tt: TTimeThread;
  tw: TTimeWatcher;

begin
  if FActive then exit;
  ServerIPC := TNetTimeIPCServer.Create(GetServerStatus, SetConfig, SetServer,
    ExitNow, UpdateNow);
  ServerIPC.InitResources;
  ttime := TTimeThread.Create(true);
  tt := (ttime as TTimeThread);
  tt.MyOwner := self;
  tt.Resume;
  ttwatch := TTimeWatcher.Create(true);
  tw := (ttwatch as TTimeWatcher);
  tw.MyOwner := self;
  tw.Resume;
  ntptime.TimeSyncGoodFunc := GetSynchronized;
  ntptime.TimeLastUpdatedFunc := GetLastUpdateTime;
  FActive := true;
end;

procedure TNetTimeServer.Stop;
begin
  if not FActive then Exit;
  Sleep(IPCSleepTime);
  ntptime.TimeSyncGoodFunc := nil;
  ntptime.TimeLastUpdatedFunc := nil;
  if assigned(ttwatch) then
    begin
      ttwatch.Terminate;
      ttwatch.WaitFor;
      ttwatch.Free;
    end;
  if assigned(ttime) then
    begin
      ttime.Terminate;
      ttime.WaitFor;
      ttime.Free;
    end;
  ServerIPC.Free;
  FActive := false;
end;

{ TTimeThread }

constructor TTimeThread.Create(const Suspended: boolean);
begin
  inherited Create(true);
  // nothing to initialize yet
  if not Suspended then
    Resume;
end;

destructor TTimeThread.Destroy;
begin
  inherited Destroy;
end;

procedure TTimeThread.SetDateTime(dDateTime: TDateTime);
var
  dSysTime: TSystemTime;
  buffer: DWord;
  tkp, tpko: TTokenPrivileges;
  hToken: THandle;

begin
  if IsWindowsNT then
    begin
      if not OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then exit;
      LookupPrivilegeValue(nil,'SE_SYSTEMTIME_NAME',tkp.Privileges[0].Luid);
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if not AdjustTokenPrivileges(hToken, FALSE, tkp, sizeof(tkp),
        tpko, buffer) then exit;
      CloseHandle(hToken);
    end;
  DateTimeToSystemTime(dDateTime, dSysTime);
  SetLocalTime(dSysTime);
end;

procedure TTimeThread.Execute;

var
  time_status: TSyncStatus;
  haveaddr, oldhaveaddr: boolean;

  function ThreadClosed: Boolean;
  begin
    Result := Terminated or (not Assigned(MyOwner));
  end;

begin
  ReturnValue := 0;
  dttime := 0;
  NowOfLastUpdate := 0;
  StatusOfLastUpdate.Synchronized := false;
  time_retrieval_time := 0;
  haveaddr := HaveLocalAddress;
  repeat
    if not ThreadClosed then
      begin
        try
          FigureBestKnownTime(MyOwner.FServerCount, MyOwner.FServers,
            time_status, dttime);
          time_retrieval_time := Now;
        except
          time_status.Synchronized := false;
        end;
        if time_status.Synchronized then
          begin
            update_rejected := false;
            if (MyOwner.FWarnAdj > 0) and
              (SecondsApart(Now,dttime) >= MyOwner.FWarnAdj) then
              begin
                MyOwner.FServerTime := dttime;
                MyOwner.FStationTime := time_retrieval_time;
                Synchronize(MyOwner.DoWarnAdj);
                update_rejected := not MyOwner.FWarnAdjResult;
              end;
            if update_rejected then
              begin
                Synchronize(MyOwner.ServerIPC.KillEverything);
                Terminate;
              end
            else
              begin
                SetDateTime(dttime + (Now - time_retrieval_time));
                NowOfLastUpdate := Now;
                StatusOfLastUpdate := time_status;
              end;
          end;
      end;
    MyOwner.FLastUpdateStatus := time_status;
    MyOwner.FWantUpdateNow := false;
    if IsWindowsNT then
      SetProcessWorkingSetSize(GetCurrentProcess,$ffffffff,$ffffffff);
    repeat
      Sleep(PollSleepTime);
      oldhaveaddr := haveaddr;
      haveaddr := HaveLocalAddress;
      if (not oldhaveaddr) and (haveaddr) then
        MyOwner.FWantUpdateNow := true;
    until self.terminated or
      (haveaddr and (
        MyOwner.FWantUpdateNow or
        (time_status.Synchronized and (SecondsApart(Now,NowOfLastUpdate) >= MyOwner.FSyncFreq)) or
        ((not time_status.Synchronized) and (SecondsApart(Now,NowOfLastUpdate) >= MyOwner.FRetry))
      ));
  until (self.terminated);
  ReturnValue := 1;
end;

{ TTimeWatcher }

procedure TTimeWatcher.Execute;

var
  oldUpdate: TDateTime;
  old_sync: boolean;

begin
  ReturnValue := 0;
  oldUpdate := 0;
  Synchronized := false;
  repeat
    Sleep(PollSleepTime);
    old_sync := Synchronized;
    if SecondsApart(Now,(MyOwner.ttime as TTimeThread).NowOfLastUpdate)
      <= int64(MyOwner.FLostSync) then
      Synchronized := (MyOwner.ttime as TTimeThread).StatusOfLastUpdate.Synchronized
    else
      Synchronized := false;
    if (Synchronized <> old_sync) or
     (oldUpdate <> (MyOwner.ttime as TTimeThread).NowOfLastUpdate) then
      begin
        Synchronize(MyOwner.DoStateChange);
        oldUpdate := (MyOwner.ttime as TTimeThread).NowOfLastUpdate;
      end;
  until (Self.Terminated);
  ReturnValue := 1;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区欧美日| 日本不卡一区二区三区高清视频| 日韩欧美色综合| 欧美色综合网站| 久久99精品久久久久久国产越南| 无吗不卡中文字幕| 亚洲高清视频的网址| 最好看的中文字幕久久| 中国av一区二区三区| 久久久国产精品午夜一区ai换脸| 欧美视频中文字幕| 95精品视频在线| 成人永久免费视频| 国产成人免费视频精品含羞草妖精| 久草这里只有精品视频| 亚洲最大成人综合| 亚洲乱码日产精品bd| 亚洲老司机在线| 国产精品天天摸av网| 欧美国产激情一区二区三区蜜月| 26uuu精品一区二区三区四区在线| 欧美哺乳videos| 精品国产乱码久久久久久久久| 91黄色激情网站| 91久久精品一区二区三区| 在线精品视频免费播放| av激情综合网| 91欧美一区二区| 欧美亚洲丝袜传媒另类| 欧美日韩免费高清一区色橹橹| 欧美日韩一二三区| 69堂亚洲精品首页| 日韩一区二区三区视频| 亚洲精品在线网站| 久久伊99综合婷婷久久伊| 国产人成一区二区三区影院| 国产精品色眯眯| 亚洲区小说区图片区qvod| 一区二区三区小说| 麻豆精品国产传媒mv男同 | 国产91丝袜在线18| av日韩在线网站| 91精品婷婷国产综合久久性色| 欧美成人bangbros| 亚洲手机成人高清视频| 日av在线不卡| www.成人网.com| 日韩一区二区三区视频在线| 国产精品久99| 日韩高清中文字幕一区| 国产成人综合在线观看| 欧美色偷偷大香| 国产网站一区二区三区| 亚洲成av人片在www色猫咪| 国产精品2024| 欧美日韩国产一二三| 久久精品网站免费观看| 亚洲成人av一区二区三区| 国产河南妇女毛片精品久久久| 在线观看亚洲成人| 久久影音资源网| 日韩一区精品视频| 97国产一区二区| 欧美成人乱码一区二区三区| 亚洲欧美日韩精品久久久久| 韩国v欧美v日本v亚洲v| 在线观看91精品国产入口| 国产亚洲一本大道中文在线| 日韩和欧美一区二区三区| 成人综合激情网| 精品国产欧美一区二区| 亚洲一区二区三区在线| 99re这里只有精品首页| 久久先锋影音av鲁色资源网| 五月婷婷激情综合网| 91啪亚洲精品| 国产精品天天看| 国产乱子伦一区二区三区国色天香| 欧美三级日本三级少妇99| 中文字幕一区二区三区精华液 | 成人成人成人在线视频| 精品久久久久久久人人人人传媒| 亚洲一二三专区| 99久久777色| 久久精品亚洲一区二区三区浴池| 日本成人在线电影网| 在线观看欧美精品| 日韩理论片在线| 国产suv一区二区三区88区| 2020国产精品自拍| 日韩 欧美一区二区三区| 欧美天堂一区二区三区| 亚洲免费伊人电影| 99re视频这里只有精品| 国产精品嫩草久久久久| 国产精品一区二区在线播放| 欧美精品一区二区精品网| 免费精品视频最新在线| 91麻豆精品国产| 日韩极品在线观看| 欧美丰满少妇xxxxx高潮对白| 一区二区三区免费在线观看| 91尤物视频在线观看| 国产精品国产馆在线真实露脸| 粉嫩高潮美女一区二区三区 | 亚洲另类春色国产| 91在线播放网址| 亚洲精品久久7777| 色老头久久综合| 亚洲综合999| 欧美三级视频在线观看| 性感美女久久精品| 69久久夜色精品国产69蝌蚪网| 日精品一区二区| 日韩视频在线一区二区| 老司机一区二区| 久久老女人爱爱| 高清日韩电视剧大全免费| 中文字幕av一区二区三区| 波多野结衣中文字幕一区二区三区 | 国产成人免费网站| 国产精品久久久久影视| 99精品热视频| 亚洲精品乱码久久久久久久久 | 精品国精品国产尤物美女| 国产综合色在线视频区| 国产欧美精品一区二区色综合朱莉| 国产91对白在线观看九色| 亚洲色图在线视频| 欧美挠脚心视频网站| 精品一区二区三区的国产在线播放 | 欧美视频第二页| 蜜桃视频免费观看一区| 26uuu国产日韩综合| 本田岬高潮一区二区三区| 亚洲国产精品尤物yw在线观看| 91精品国产福利在线观看| 国产乱码一区二区三区| 1区2区3区国产精品| 欧美揉bbbbb揉bbbbb| 国内精品久久久久影院一蜜桃| 亚洲欧洲av色图| 在线不卡a资源高清| 国产乱子伦一区二区三区国色天香| 亚洲欧美综合另类在线卡通| 欧美日韩一区高清| 激情综合网av| 亚洲女人****多毛耸耸8| 日韩一区二区免费高清| 成人短视频下载| 日韩精品欧美精品| 国产性做久久久久久| 色偷偷久久人人79超碰人人澡| 日韩av中文字幕一区二区| 中文字幕免费一区| 欧美酷刑日本凌虐凌虐| 国产ts人妖一区二区| 首页综合国产亚洲丝袜| 日本一区二区动态图| 欧美理论电影在线| heyzo一本久久综合| 热久久久久久久| 亚洲视频免费在线| 精品国产伦一区二区三区免费| 一本一道久久a久久精品| 激情成人综合网| 亚洲a一区二区| 成人免费一区二区三区在线观看| 欧美一区二区三区婷婷月色| 99久久久精品| 国产尤物一区二区| 婷婷六月综合亚洲| 中文字幕在线一区| 精品奇米国产一区二区三区| 在线视频一区二区免费| 成人小视频在线观看| 久久99久久久欧美国产| 亚洲成人自拍一区| 亚洲欧美日韩一区二区 | 日韩不卡一二三区| 亚洲精品国产一区二区三区四区在线 | 久久亚洲综合色一区二区三区| 91精品国产一区二区三区蜜臀| 一本色道久久加勒比精品| 成人综合在线观看| 国产精品一区2区| 久久99精品一区二区三区| 石原莉奈在线亚洲三区| 亚洲国产另类精品专区| 亚洲你懂的在线视频| 中文字幕一区二区在线观看| 国产婷婷色一区二区三区在线| 欧美成人国产一区二区| 91精品国产福利在线观看| 欧美精选在线播放| 欧洲精品一区二区三区在线观看| 99免费精品视频| 白白色 亚洲乱淫| 国产suv一区二区三区88区| 国产精品88888|