我正在开发一个需要根据用户设置的时间计划任务的应用程序。用户可以添加/修改/删除时间表。为了实现它,我正在考虑使用计时器队列。最初,我虽然使用了非常适合我的目的的WaitableTimers套件,但是我无法让我的线程进入竞争APC的睡眠状态。
现在,使用计时器队列,我不确定如何将计时器设置为基于系统时间发出信号。我尝试了以下代码,但从未调用过回调函数
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;
}
最佳答案
回调例程将在qwResult
毫秒内被调用,文件时间为您提供100纳秒的时间。你做数学。 GetSystemTimeAsFileTime
如果您想走这条路,它将立即给您FILETIME
。
就个人而言,我会保留一个结构列表,其中包含应调用例程的时间,以及指向例程的指针,并不时地遍历该列表,如果执行时间到期,我将调用函数(或创建线程) 。这样,您的用户就可以始终查看计划的任务并进行更改。