Однократный таймер в C ++ на WinCE

Я пишу функцию обработки событий, f(d), который получает некоторые данные, dи должны принять меры X(d)затем поспите 100 мс, затем выполните другое действие Y(d), Я бы реализовал это так:

void f(d)
{
X(d);
Sleep(100);
Y(d);
}

Тем не мение, f(d) вызывается из однопоточного обработчика событий, поэтому Sleep (100) недопустим.

Я хотел бы сделать следующее:

void f(d)
{
X(d);
ScheduleOneShotTimer(Y,d,100);
}

Я мог бы реализовать ScheduleOneShotTimer путем создания нового потока для каждого вызова, передачи данных в качестве параметра потока и вызова Sleep перед выполнением Y(d), Однако, поскольку это событие может происходить до 100 раз в секунду, я обеспокоен накладными расходами, связанными с созданием уничтожения всех этих потоков.

Предпочтительно, чтобы была поддержка на уровне операционной системы для «таймера с одним выстрелом», но я не думаю, что это относится к CE. Я знаю о SetTimer, но это не относится ко мне, потому что я пишу «Консольное приложение», в котором нет цикла сообщений.

Любые другие предложения о том, как структурировать это, будут оценены.

4

Решение

Позвоните timeSetEvent API (полностью неинтуитивное имя API, я знаю). Используйте функцию обратного вызова и TIME_ONESHOT параметр.

6

Другие решения

Я бы создал один поток, который будет хранить очередь пар меток времени и обратного вызова, спать в течение 100 мс (или чего-то меньшего), а затем выполнять все прошедшие обратные вызовы.
OFC со всей синхронизацией между потоками (блокировка в критической секции и т. Д.).

Это решение, ориентированное на производительность, а не ориентированное на точность. По мере накопления обратных вызовов выполнение может занять больше времени, чем ровно 100 мс. Но так как вы измеряете время с помощью Wait (что не является точным), я думаю, это может быть достаточно хорошо.

0

По вопросам рекламы [email protected]