Я пишу функцию обработки событий, 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, но это не относится ко мне, потому что я пишу «Консольное приложение», в котором нет цикла сообщений.
Любые другие предложения о том, как структурировать это, будут оценены.
Позвоните timeSetEvent
API (полностью неинтуитивное имя API, я знаю). Используйте функцию обратного вызова и TIME_ONESHOT
параметр.
Я бы создал один поток, который будет хранить очередь пар меток времени и обратного вызова, спать в течение 100 мс (или чего-то меньшего), а затем выполнять все прошедшие обратные вызовы.
OFC со всей синхронизацией между потоками (блокировка в критической секции и т. Д.).
Это решение, ориентированное на производительность, а не ориентированное на точность. По мере накопления обратных вызовов выполнение может занять больше времени, чем ровно 100 мс. Но так как вы измеряете время с помощью Wait (что не является точным), я думаю, это может быть достаточно хорошо.