程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 多線程編程(15) - 多線程同步之WaitableTimer(等待定時器對象)[續](2)

多線程編程(15) - 多線程同步之WaitableTimer(等待定時器對象)[續](2)

編輯:Delphi

當我們需要一個絕對時間時, 譬如 2009-2-18 13:10:5, 函數需要的 Int64 值應該是個 TFileTime 格式的時間.

先看三種相關時間類型(TFileTime、TSystemTime、TDateTime)的定義:

TFileTime(又名 FILETIME 或 _FILETIME)
_FILETIME = record
 dwLowDateTime: DWord;
 dwHighDateTime: DWord;
end;
TSystemTime(又名 SYSTEMTIME 或 _SYSTEMTIME)
_SYSTEMTIME = record
 wYear: Word;
 wMonth: Word;
 wDayOfWeek: Word;
 wDay: Word;
 wHour: Word;
 wMinute: Word;
 wSecond: Word;
 wMilliseconds: Word;
end;
TDateTime = type Double;
//TFileTime 相當於一個 Int64, 一般要通過給 TSystemTime 或 TDateTime 賦值, 然後轉換過去.
//在例子中我是通過下面過程轉過去的:
StrToDateTime -> DateTimeToSystemTime -> SystemTimeToFileTime -> LocalFileTimeToFileTime

下面程序指定在 2009年2月18號下午1點10分5秒時運行三個線程(窗體同上, 我已找了個合適的時間測試成功).

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
var
 f: Integer;
 hWaitableTimer: THandle;
function MyThreadFun(p: Pointer): DWord; stdcall;
var
 i,y: Integer;
begin
 Inc(f);
 y := 20 * f;
 if WaitForSingleObject(hWaitableTimer, INFINITE) = WAIT_OBJECT_0 then
 begin
  for i := 0 to 1000 do
  begin
   Form1.Canvas.Lock;
   Form1.Canvas.TextOut(20, y, IntToStr(i));
   Form1.Canvas.Unlock;
   Sleep(1);
  end;
 end;
 Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
 strTime = '2009-2-18 13:10:5';
var
 ThreadID: DWord;
 DueTime: Int64;
 st: TSystemTime;
 ft,UTC: TFileTime;
 dt: TDateTime;
begin
 DateTimeToSystemTime(StrToDateTime(strTime), st); {從 TDateTime 到 TSystemTime}
 SystemTimeToFileTime(st, ft);           {從 TSystemTime 到 TFileTime}
 LocalFileTimeToFileTime(ft, UTC);         {從本地時間到國際標准時間 UTC}
 DueTime := Int64(UTC);              {函數需要的是 Int64}
 hWaitableTimer := CreateWaitableTimer(nil, True, nil);
 SetWaitableTimer(hWaitableTimer, DueTime, 0, nil, nil, False);
 Repaint; f := 0;
 CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);
 CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);
 CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 CloseHandle(hWaitableTimer);
end;
end.

接下來該是 WaitableTimer 對象的回調函數了.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved