У меня есть следующий код (вручную скопированный):
// Simple stop watch class basically takes "now" as the start time and
// returns the diff when asked for.
class stop_watch {...}
// global var
std::thread timer_thread;
void start_timer(int timeout_ms)
{
timer_thread = std::thread([timeout_ms, this](){
stop_watch sw;
while (sw.get_elapsed_time() < timeout_ms)
{
// Here is the sleep to stop from hammering a CPU
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
// Do timeout things here...
std::cout << "timed out!" << std::endl;
})
}
Я не хотел слишком увязнуть в деталях класса, который я пишу, так что это очень сокращенная версия. Полный класс вызывает функцию call-back и имеет переменную, чтобы отменить таймер и т.д....
Я просто хотел сосредоточиться на части "сна". Могу ли я реализовать что-то подобное без сна или есть лучший способ сделать это? - или сон совершенно хорош? - Я считал, что сон, как правило, является признаком плохого дизайна (я читал, что несколько мест)... но я не могу придумать способ реализовать таймер без него :(
Дополнительное примечание. Таймер должен иметь требование быть в состоянии быть остановленным/пробужденным в любое время. Просто добавив это для ясности, потому что, похоже, это влияет на решение. В моем исходном коде (не этом фрагменте) я использовал атомный флаг bool, который может выйти из цикла.