多線程編程(14)

來源:互聯網
上載者:User

function CreateWaitableTimer(
 lpTimerAttributes: PSecurityAttributes; {安全}
 bManualReset: BOOL;  {True: 可調度多個線程; False: 只調度一個線程}
 lpTimerName: PWideChar {名稱}
): THandle; stdcall;   {返回控制代碼}
function SetWaitableTimer(
 hTimer: THandle;             {控制代碼}
 var lpDueTime: TLargeInteger;      {起始時間}
 lPeriod: Longint;            {間隔時間}
 pfnCompletionRoutine: TFNTimerAPCRoutine;{回呼函數的指標}
 lpArgToCompletionRoutine: Pointer;    {給回呼函數的參數}
 fResume: BOOL              {是否喚醒系統}
): BOOL; stdcall;             {}

WaitableTimer 對象較複雜, 其基本的理念是讓等候的線程在指定的時間運行.

像其他同類對象一樣, 先要建立(CreateWaitableTimer), 建立函數的第二個參數決定是調度一個線程還是所有等候的線程; 這一點和訊號對象(Semaphore) 有些類似, 不過 Semaphore 可以指定可驅動線程的具體數目.

和其他同類對象不同的是: 在 CreateWaitableTimer 以後, WaitableTimer 對象並沒有馬上開始工作;

再調用 SetWaitableTimer 函數後才能讓它發揮作用. 這又有點像 Event 對象.

SetWaitableTimer 函數比較麻煩, 得慢慢來, 譬如這樣使用:

var
 hWaitableTimer: THandle; {WaitableTimer 對象的控制代碼變數應該是全域的}
procedure TForm1.Button1Click(Sender: TObject);
var
 DueTime: Int64;
begin
 {建立 WaitableTimer 對象並返回控制代碼}
 hWaitableTimer := CreateWaitableTimer(nil, True, nil); {中間的 True 表示可驅動多個線程}
 DueTime := 0; {這將是 SetWaitableTimer 的第二個參數; 因為是 var 參數, 不能直接給常量}
 SetWaitableTimer(hWaitableTimer, {WaitableTimer 對象的控制代碼}
          DueTime,    {起始時間, 這裡給的是 0}
          0,       {間隔時間, 這裡給的也是 0}
          nil,      {暫不用回呼函數}
          nil,      {當然也不需要給回呼函數參數了}
          False {此值若是 True, 即使系統在屏保或待機狀態, 時間一到線程和系統將都被喚醒!}
          );
end;
{再說明:
起始時間(第二個參數)有三種賦值方法:
1、> 0 時是絕對時間, 是一個 TFileTime 格式的時間(具體賦值方法後面詳解);
2、< 0 時是相對時間, 相對是相對於當前, 譬如 -50000000 表示 5 秒鐘後執行(單位是0.1毫秒, 後面詳述);
3、= 0 時, 立即執行, 不再等待; 上面的舉例和下面第一個例子我們先用 0.
間隔時間(第三個參數)有兩種情況:
1、譬如 5000 表示每隔 5 秒鐘執行一次, 其單位是毫秒; 本頁第二個例子使用了 500(半秒);
2、如果賦值為 0, 表示根據起始時間只執行一次, 不再重複執行.
回呼函數及其參數(第四、五個參數), 這會牽扯出一個更複雜的話題(APC), 暫時不用它, 後面再說.
最後一個參數上面已經說清楚了, 我也測試了一下(分別在屏保和待機狀態下), 很有效!
}

第一個例子我們將盡量簡單的使用它(但這樣體現不出它的優勢):

CreateWaitableTimer 時我們就決定讓它可控制多個線程;

SetWaitableTimer 時先讓它立即參與控制, 只執行一次, 也不使用回呼函數.

本例效果圖:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.