2011-07-19 32 views
0

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

} 

回答

2

回调例程将在qwResult毫秒被调用,文件的时间为您提供了100纳秒的时间。你做数学。 GetSystemTimeAsFileTime如果这是你想要走的路,马上就会给你FILETIME。我个人会保留一个结构列表,当应该调用例程并指向例程并在一段时间内遍历列表时,如果执行时间到期,我只需调用函数(或创建一个线程)。这样,用户可以随时查看计划任务并对其进行更改。

+0

我将有许多这样的队列,所以我不能够负担得起一个线程为每个队列。这种方法背后的想法,我应该能够调用一个函数,当用户设置的时间到期 – Jeeva

+0

那么你不必为每个函数创建一个线程,但我不认为计划一个计时器运行在12小时是一个好主意, imho你应该创建一个线程来不断监视任务列表并创建类似于线程池的任务,以在有限数量的线程上执行任务,如果没有线程可用,则您的任务将不得不等待 – Djole

1

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

+0

i不这么认为,因为当我硬编码时间到10回调函数被调用。问题是算术或我将文件时间转换为无符号长整数值的方式 – Jeeva

+1

请理解绝对时间和相对时间之间的差异。 – Ajay

1

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

如果你希望计时器在20秒内熄灭,合格20000代替qwResult

+0

感谢您指出错误。我已经改变了基于相对时间调用定时器的代码。但正如SS Kain指出的,我可能无法在15天后调用定时器或类似的东西,因为毫秒的差异将非常大,以适应DWORD – Jeeva

+0

哇,15天是一个问题?您可能要考虑重新评估您如何接近您的日程安排。例如,您可能只想安排前几项任务,并且每次处理任务时都要查看队列中的下一项内容。 – Cechner