多线程编程(15) - 多线程同步之 WaitableTimer (等待定时器对象)[续]
生活随笔
收集整理的這篇文章主要介紹了
多线程编程(15) - 多线程同步之 WaitableTimer (等待定时器对象)[续]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本次專門研究下 SetWaitableTimer 的第二個參數(起始時間).
它有正值、負值、0值三種情況, 前面已用過 0值.
先學習負值(相對時間), 也就是從當前算起隔多長時間開始執行.
這個相對時間是以 1/100 納秒為單位的, 譬如賦值 3*10000000 相當于 3 秒.
1 s(秒) = 1,000 ms(毫秒); 1 s(秒) = 1,000,000 μs(微妙); 1 s(秒) = 1,000,000,000 ns(納秒); 1 s(秒) = 1,000,000,000,000 ps(皮秒);
本例效果圖:
代碼文件:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}varf: Integer;hWaitableTimer: THandle;function MyThreadFun(p: Pointer): DWORD; stdcall; vari,y: Integer; beginInc(f);y := 20 * f;if WaitForSingleObject(hWaitableTimer, INFINITE) = WAIT_OBJECT_0 thenbeginfor i := 0 to 1000 dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(20, y, IntToStr(i));Form1.Canvas.Unlock;Sleep(1);end;end;Result := 0; end;procedure TForm1.Button1Click(Sender: TObject); varThreadID: DWORD;DueTime: Int64; beginhWaitableTimer := CreateWaitableTimer(nil, True, nil);DueTime := -3*10000000; {3秒鐘后執行}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); beginCloseHandle(hWaitableTimer); end;end.
窗體文件:
object Form1: TForm1Left = 0Top = 0Caption = 'Form1'ClientHeight = 116ClientWidth = 179Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'Tahoma'Font.Style = []OldCreateOrder = FalseOnDestroy = FormDestroyPixelsPerInch = 96TextHeight = 13object Button1: TButtonLeft = 96Top = 83Width = 75Height = 25Caption = 'Button1'TabOrder = 0OnClick = Button1Clickend end
當我們需要一個絕對時間時, 譬如 2009-2-18 13:10:5, 函數需要的 Int64 值應該是個 TFileTime 格式的時間.
先看三種相關時間類型(TFileTime、TSystemTime、TDateTime)的定義:
TFileTime(又名 FILETIME 或 _FILETIME) _FILETIME = recorddwLowDateTime: DWORD;dwHighDateTime: DWORD; end;TSystemTime(又名 SYSTEMTIME 或 _SYSTEMTIME) _SYSTEMTIME = recordwYear: 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;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}varf: Integer;hWaitableTimer: THandle;function MyThreadFun(p: Pointer): DWORD; stdcall; vari,y: Integer; beginInc(f);y := 20 * f;if WaitForSingleObject(hWaitableTimer, INFINITE) = WAIT_OBJECT_0 thenbeginfor i := 0 to 1000 dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(20, y, IntToStr(i));Form1.Canvas.Unlock;Sleep(1);end;end;Result := 0; end;procedure TForm1.Button1Click(Sender: TObject); conststrTime = '2009-2-18 13:10:5'; varThreadID: DWORD;DueTime: Int64;st: TSystemTime;ft,UTC: TFileTime;dt: TDateTime; beginDateTimeToSystemTime(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); beginCloseHandle(hWaitableTimer); end;end.
接下來該是 WaitableTimer 對象的回調函數了.
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的多线程编程(15) - 多线程同步之 WaitableTimer (等待定时器对象)[续]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上接游戏人生Silverlight(2)
- 下一篇: 如何保持Oracle数据库优良性能