1. 程式人生 > >016 可等待計時器對象.6

016 可等待計時器對象.6

can != 原型 信號 內部 計時器 存儲 oid map

可等待計時器對象.

  ● CreateWaitableTimer

  函數原型

1 HANDLE WINAPI CreateWaitableTimer(
2   _In_opt_ LPSECURITY_ATTRIBUTES lpTimerAttributes,
3   _In_     BOOL                  bManualReset,
4   _In_opt_ LPCTSTR               lpTimerName
5 );

    參數1:lpSemaphoreAttributes

    SECURITY_ATTRIBUTES,指定一個結構,用於設置對象的安全特性。如將參數聲明為ByVal As Long,並傳遞零值,就可使用對象的默認安全設置。

   參數2bManualReset
    Long,如果為TRUE,表示創建一個人工重置計時器;如果為FALSE,則創建一個自動重置計時器。

   參數3lpName
    String,指定可等待計時器對象的名稱。用vbNullString可創建一個未命名的計時器對象。如果已經存在擁有這個名字的一個可等待計時器,就直接打開現成的可等待計時器。這個名字可能不與一個現有的互斥體、事件、信號機或文件映射的名稱相符。

    使用人工重置,則計時結束後所有的等待線程均變為可調度線程;使用自動重置,則只有一個線程變為可調度線程。

  ● SetWaitableTimer

  函數原型

1 BOOL WINAPI SetWaitableTimer(
2   _In_           HANDLE           hTimer,
3   _In_     const LARGE_INTEGER    *pDueTime,
4   _In_           LONG             lPeriod,
5   _In_opt_       PTIMERAPCROUTINE pfnCompletionRoutine,
6   _In_opt_       LPVOID           lpArgToCompletionRoutine,
7   _In_           BOOL             fResume
8 );

  參數1: hTimer [in]

    CreateWaitableTimer OpenWaitableTimer 返回的一個句柄

  參數2:pDueTime [in]

    在100納秒間隔內,計時器的狀態將被設置為信號的時間。使用FILETIME結構描述的格式。正值表示絕對時間。一定要使用基於utc的絕對時間,因為系統在內部使用utc時間。負值表示相對時間。實際計時器的準確性取決於硬件的性能。有關基於utc時間的更多信息,請參閱系統時間。

  ○ 參數3 lPeriod [in]

    計時器的周期,以毫秒為單位。如果lPeriod為零,則計時器將顯示一次。如果lPeriod大於0,計時器是周期性的。每當周期結束時,定時計時器會自動重新啟動,直到計時器被取消使用CancelWaitableTimer函數或重置使用SetWaitableTimer。如果lPeriod小於0,則函數失敗。

  參數4 pfnCompletionRoutine [in, optional]

    指向可選完成例程的指針。完成例程是PTIMERAPCROUTINE的應用程序定義函數,當計時器被釋放時執行。有關計時器回調函數的更多信息,請參見TimerAPCProc。有關APCs和線程池線程的更多信息,請參見備註。

   參數5 lpArgToCompletionRoutine [in, optional]

    傳遞到完成程序的結構的指針。

   參數6 fResume [in]

    如果這個參數是正確的,那麽當定時器狀態設置為信號時,重新存儲一個暫停電源保護模式的系統。否則,系統就無法恢復。如果系統不支持恢復,則調用成功,但是GetLastError返回ERROR_NOT_SUPPORT。

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <windows.h>
 4 
 5 int main()
 6 {
 7     HANDLE hTimer = CreateWaitableTimer(nullptr, TRUE, nullptr);
 8     
 9     //時間建構體
10     SYSTEMTIME st = {0};
11     st.wYear = 2017;    //
12     st.wMonth = 7;        //
13     st.wDay = 4;        //14     
15     //時間轉換
16     FILETIME ftLocal;
17     SystemTimeToFileTime(&st,&ftLocal);
18     
19     LARGE_INTEGER liDueTime;
20     liDueTime.QuadPart = -100000000LL;
21     
22     SetWaitableTimer(hTimer, &liDueTime, 1000, nullptr, nullptr, FALSE);
23     if(WaitForSingleObject(hTimer, INFINITE) == WAIT_TIMEOUT)
24         printf("Time out........");
25     return 0;
26 }

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <process.h>
 4 #include <windows.h>
 5 
 6 HANDLE hTimer;
 7 CRITICAL_SECTION gCS;
 8 
 9 unsigned __stdcall ThreadFunc(void* lParam)
10 {
11     while(WaitForSingleObject(hTimer, INFINITE) != WAIT_TIMEOUT)
12     {
13         printf("Time out........\r\n");
14         CancelWaitableTimer(hTimer);
15     }
16     return 0;
17 }
18 
19 int main()
20 {
21     InitializeCriticalSection(&gCS);
22     hTimer = CreateWaitableTimer(nullptr, TRUE, nullptr);
23     
24     HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)1,  0, nullptr);
25     
26     //時間建構體
27     SYSTEMTIME st = {0};
28     st.wYear = 2017;    //
29     st.wMonth = 7;        //
30     st.wDay = 4;        //31     
32     //時間轉換
33     FILETIME ftLocal;
34     SystemTimeToFileTime(&st,&ftLocal);
35     
36     LARGE_INTEGER liDueTime;
37     liDueTime.QuadPart = -1;    //100納秒
38     
39     SetWaitableTimer(hTimer, &liDueTime, 1000, nullptr, nullptr, FALSE);
40     /*
41     if(WaitForSingleObject(hTimer, INFINITE) == WAIT_TIMEOUT)
42         printf("Time out........");
43     */
44     WaitForSingleObject(hThread,INFINITE);
45     DeleteCriticalSection(&gCS);
46     CloseHandle(hTimer);
47     return 0;
48 }

技術分享

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <process.h>
 4 #include <windows.h>
 5 
 6 HANDLE hTimer;
 7 CRITICAL_SECTION gCS;
 8 
 9 unsigned __stdcall ThreadFunc(void* lParam)
10 {
11     while(WaitForSingleObject(hTimer, INFINITE) != WAIT_TIMEOUT)
12     {
13         EnterCriticalSection(&gCS);
14         printf("Time out........\r\n");
15         //if(!CancelWaitableTimer(hTimer))
16         //    printf("Error");
17         LeaveCriticalSection(&gCS);
18     }
19     return 0;
20 }
21 
22 int main()
23 {
24     InitializeCriticalSection(&gCS);
25     hTimer = CreateWaitableTimer(nullptr, FALSE, nullptr);
26     
27     HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)1,  0, nullptr);
28     
29     //時間建構體
30     SYSTEMTIME st = {0};
31     st.wYear = 2017;    //
32     st.wMonth = 7;        //
33     st.wDay = 4;        //34     
35     //時間轉換
36     FILETIME ftLocal;
37     SystemTimeToFileTime(&st,&ftLocal);
38     
39     LARGE_INTEGER liDueTime;
40     liDueTime.QuadPart = -1;    //100納秒
41     
42     SetWaitableTimer(hTimer, &liDueTime, 1000, nullptr, nullptr, FALSE);
43     /*
44     if(WaitForSingleObject(hTimer, INFINITE) == WAIT_TIMEOUT)
45         printf("Time out........");
46     */
47     WaitForSingleObject(hThread,INFINITE);
48     DeleteCriticalSection(&gCS);
49     CloseHandle(hTimer);
50     return 0;
51 }

技術分享

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <process.h>
 4 #include <windows.h>
 5 
 6 HANDLE hTimer;
 7 CRITICAL_SECTION gCS;
 8 
 9 unsigned __stdcall ThreadFunc(void* lParam)
10 {
11     while(WaitForSingleObject(hTimer, INFINITE) != WAIT_TIMEOUT)
12     {
13         EnterCriticalSection(&gCS);
14         printf("%d Time out........\r\n",(int)lParam);
15         //if(!CancelWaitableTimer(hTimer))
16         //    printf("Error");
17         LeaveCriticalSection(&gCS);
18     }
19     return 0;
20 }
21 
22 int main()
23 {
24     InitializeCriticalSection(&gCS);
25     hTimer = CreateWaitableTimer(nullptr, FALSE, nullptr);
26     
27     HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)1,  0, nullptr);
28     HANDLE hThread2 = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)2,  0, nullptr);
29     HANDLE hThread3 = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)3,  0, nullptr);
30     HANDLE hThread4 = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)4,  0, nullptr);
31     //時間建構體
32     SYSTEMTIME st = {0};
33     st.wYear = 2017;    //
34     st.wMonth = 7;        //
35     st.wDay = 4;        //36     
37     //時間轉換
38     FILETIME ftLocal;
39     SystemTimeToFileTime(&st,&ftLocal);
40     
41     LARGE_INTEGER liDueTime;
42     liDueTime.QuadPart = -1;    //100納秒
43     
44     SetWaitableTimer(hTimer, &liDueTime, 1000, nullptr, nullptr, FALSE);
45     /*
46     if(WaitForSingleObject(hTimer, INFINITE) == WAIT_TIMEOUT)
47         printf("Time out........");
48     */
49     WaitForSingleObject(hThread,INFINITE);
50     DeleteCriticalSection(&gCS);
51     CloseHandle(hTimer);
52     return 0;
53 }

技術分享

016 可等待計時器對象.6