2017年做SR程序时写的一个备忘录,今天再次使用定时器,翻出来看看,记录下。
自动重置的定时器,信号一到自动执行回调函数,需要用SleepEx才能执行回调函数。
#include "stdafx.h"
#include <windows.h>
VOID CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue)
{
printf("时间到\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);/* 自动重置定时器 */
if (hTimer == NULL){
fprintf(stderr, "创建定时器失败!\n");
return -1;
}
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -20000000;/* 定时器2S后开始 */
/* 设置的定时器时间间隔为2S */
if (!SetWaitableTimer(hTimer, &liDueTime, 2000, TimerAPCProc, NULL, FALSE)){
CloseHandle(hTimer);
fprintf(stderr, "SetWaitableTimer失败!\n");
return -1;
}
while (true){
SleepEx(INFINITE, TRUE);
}
return 0;
}
人工重置的定时器,每次等待完信号,定时器不会自动重置,需要自己调用SetWaitableTimer重置。
#include "stdafx.h"
#include <windows.h>
VOID CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue)
{
printf("时间到\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hTimer = CreateWaitableTimer(NULL, TRUE, NULL);/* 人工重置 */
if (hTimer == NULL){
fprintf(stderr, "创建定时器失败!\n");
return -1;
}
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -20000000;/* 定时器2S后开始 */
while (true){
if (!SetWaitableTimer(hTimer, &liDueTime, 0, TimerAPCProc, NULL, FALSE)){
CloseHandle(hTimer);
fprintf(stderr, "SetWaitableTimer失败!\n");
return -1;
}
SleepEx(INFINITE, TRUE);
}
return 0;
}
其实回调函数也没什么必要,回调函数与我们等待的函数其实都是在同一个线程,还不如改成这样更好:
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);/* 自动重置定时器 */
if (hTimer == NULL){
fprintf(stderr, "创建定时器失败!\n");
return -1;
}
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -20000000;/* 定时器2S后开始 */
/* 设置的定时器时间间隔为2S */
if (!SetWaitableTimer(hTimer, &liDueTime, 2000, NULL, NULL, FALSE)){
CloseHandle(hTimer);
fprintf(stderr, "SetWaitableTimer失败!\n");
return -1;
}
while (true){
WaitForSingleObject(hTimer, INFINITE);
printf("时间到");
}
return 0;
}