调度程序使用计时器队列

时间:2011-07-19 07:50:53

标签: c++ winapi visual-c++ mfc

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

}

3 个答案:

答案 0 :(得分:2)

回调例程将在qwResult毫秒内调用,文件时间为您提供100纳秒的时间。你做数学。 GetSystemTimeAsFileTime如果这是你想去的路径,会立即给你FILETIME

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

答案 1 :(得分:1)

它需要由WaitForSingleObject支持,或者将线程输入等待状态(例如,使用SleepEx)。

答案 2 :(得分:1)

你正在绝对时间内通过,但docs表示你需要传递当前时间的毫秒数。

如果您希望计时器在20秒内关闭,请传递20000而不是qwResult