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

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

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

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

Кто-нибудь знает, как мне поступить?

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

Ответы [ 2 ]

1 голос
/ 18 марта 2012

Даже если это настолько полезно и просто, что не переносимо, 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).

0 голосов
/ 18 марта 2012

Вы можете использовать setittimer .

...