Планировщик, использующий очереди таймера - PullRequest
0 голосов
/ 19 июля 2011

Я работаю над приложением, в котором мне нужно планировать задачи на основе времени, установленного пользователем.Пользователь может добавлять / изменять / удалять расписания.Для его реализации я рассматриваю возможность использования очередей таймера.Изначально я хотел использовать 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;

}

Ответы [ 3 ]

2 голосов
/ 19 июля 2011

Процедура обратного вызова будет вызываться в qwResult миллисекундах, а время файла дает вам время в 100 наносекунд. Вы делаете математику. GetSystemTimeAsFileTime Даст вам FILETIME сразу, если это тот путь, по которому вы хотите идти.

Лично я бы вел список структур со временем, когда должны вызываться подпрограммы, и указателями на подпрограммы, и время от времени перебирал список, и если время выполнения истекло, я просто вызывал функцию (или создавал Тема). Таким образом, ваши пользователи всегда могут просмотреть запланированные задачи и изменить их.

1 голос
/ 19 июля 2011

Вы проходите в абсолютном времени, но документы говорят, что вам нужно передать количество миллисекунд от текущего времени.

Если вы хотите, чтобы таймер отключился через 20 секунд, передайте 20000 вместо qwResult

1 голос
/ 19 июля 2011

Он должен быть поддержан WaitForSingleObject, или переводить поток в состояние ожидания (например, SleepEx).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...