我正在开发一个需要根据用户设置的时间计划任务的应用程序。用户可以添加/修改/删除时间表。为了实现它,我正在考虑使用计时器队列。最初,我虽然使用了非常适合我的目的的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

就个人而言,我会保留一个结构列表,其中包含应调用例程的时间,以及指向例程的指针,并不时地遍历该列表,如果执行时间到期,我将调用函数(或创建线程) 。这样,您的用户就可以始终查看计划的任务并进行更改。

09-13 04:33