Функция вызова 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).