我正在开发一个应用程序,我需要根据用户设置的时间安排任务。用户可以添加/修改/删除日程表。为了实现它,我正在考虑使用计时器队列。最初我虽然使用WaitableTimers非常适合我的目的,但我不能让我的线程睡觉以竞争APC。
现在使用Timer Queue我不知道如何根据Systemtime将定时器设置为信号。我尝试了以下代码,但从不调用回调函数
SYSTEMTIME st, lt;
GetSystemTime(&st);
FILETIME ft;
SystemTimeToFileTime(&st, &ft);
ULONGLONG qwResult;
// Copy the time into a quadword.
qwResult = (((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
// Add 20 seconds days.
qwResult += 20 * _SECOND;
HANDLE hTimerQueue = CreateTimerQueue();
HANDLE hTimer;
// Set a timer to call the timer routine in 10 seconds.
if (!CreateTimerQueueTimer( &hTimer, hTimerQueue ,(WAITORTIMERCALLBACK)TimerAPCProc, NULL , qwResult, 0, 0))
{
printf("CreateTimerQueueTimer failed (%d)\n", GetLastError());
return 3;
}
答案 0 :(得分:2)
回调例程将在qwResult
毫秒内调用,文件时间为您提供100纳秒的时间。你做数学。 GetSystemTimeAsFileTime
如果这是你想去的路径,会立即给你FILETIME
。
就个人而言,我会保留一个结构列表,其中包含应该调用例程的时间和指向例程的指针,并偶尔遍历列表,如果执行时间到期,我只需调用该函数(或创建一个线程)。这样,您的用户就可以随时查看计划任务并进行更改。
答案 1 :(得分:1)
它需要由WaitForSingleObject
支持,或者将线程输入等待状态(例如,使用SleepEx
)。
答案 2 :(得分:1)
你正在绝对时间内通过,但docs表示你需要传递当前时间的毫秒数。
如果您希望计时器在20秒内关闭,请传递20000而不是qwResult