016 可等待計時器對象.6
可等待計時器對象.
● 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,並傳遞零值,就可使用對象的默認安全設置。
○ 參數2:bManualReset
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 fResume8 );
○ 參數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