Функция вызова C++ после определенного периода времени - без повышения

Мне нужно иметь возможность установить таймер на количество X миллисекунд, а затем вызвать его функцию, когда он истекает.

Я посмотрел вокруг и увидел некоторые решения, использующие Boost \ asio, но я не могу использовать Boost.

В идеале я хотел бы, чтобы решение работало на Windows и Linux. Это высокий заказ, я знаю!

Кто-нибудь знает, как я поступил бы по этому поводу?

Изменить: Программа является интерактивной, поэтому я не могу перевести поток в спящий режим. И я бы предпочел не использовать решение, которое использует спиннинг, т.е. while(enough time hasn't elapsed) { }

2 ответа

Даже если это так полезно и просто, но не переносимо, Windows и Linux используют разные библиотеки потоков, поэтому вам нужно написать что-то вроде этого:

#if defined WIN32
 // Timer for Windows: it uses SetTimer
#endif
#if defined __LINUX__
 // Timer for Linux: it uses settimer
#endif

Код не так короток, чтобы писать здесь, поэтому ищите здесь таймер Windows. На Windows вы можете рассмотреть, вместо SetTimer(), чтобы использовать более простой PostMessageDelayed(), Это будет использовать еще меньше ресурсов.
Для Linux вы можете написать что-то вроде этого:

void test_timer()
{
 signal(SIGALRM, alarm_handler);
 alarm(60); // 1 minute, granularity is 1 second
}

void alarm_handler(int signo)
{
 if (signo == SIGALRM)
 {
   // Time elapsed
 }
}

Дополнение Если вам нужно написать переносную библиотеку, возможно, идея использовать SetTimer() для версии Windows довольно уродлива. Для Windows вы можете создать фоновый поток, а затем перевести его в спящий режим на необходимое время (так что вы будете делать все без сообщений Windows).

Вы должны быть в состоянии использовать setittimer.

Другие вопросы по тегам