Портативный периодический таймер на период около 100 мс - PullRequest
2 голосов
/ 13 июля 2009

Хей!

Я ищу портативный способ периодической отправки задачи в проекте C ++. В этом конкретном проекте следует избегать использования таких библиотек, как boost.

Требование к разрешению не слишком серьезное: от 5 Гц до 20 Гц для среднего нетбука.

В проекте используется OpenGL для рендеринга HMI, но, поскольку я работаю с серверной частью, я не слишком знаком с ним.

Спасибо за любые советы или предложения, Arne

РЕДАКТИРОВАТЬ: На самом деле наш класс 'Task' создает поток, используя либо CreateThread (..) для windows, либо pthread_create (..) для linux.

Ответы [ 4 ]

1 голос
/ 13 июля 2009

Самый простой способ добиться этого - использовать Sleep (100 мс) в цикле, все, что вам нужно, это портативный Sleep. Для Linux это может быть реализовано следующим образом

void Sleep(unsigned long ulMilliseconds)
{
    struct timeval timeout;
    timeout.tv_sec = 0;
    timeout.tv_usec = ulMilliseconds * 1000;
    select(1, NULL, NULL, NULL, &timeout);
} 
1 голос
/ 13 июля 2009

Поскольку вы уже знаете полный набор целевых систем, вы можете пойти по пути SQLite . У них точно такая же проблема - многие вещи, которые они используют, зависят от системы.

Все зависящие от системы вещи реализованы отдельно для каждой целевой системы, и правильная версия компилируется в зависимости от установленных директив препроцессора.

1 голос
/ 13 июля 2009

Если вам нужен периодический триггер, поток, который спит в течение 100 мс в цикле, может добиться цели.

0 голосов
/ 13 июля 2009

Ну, я думаю, вы можете найти множество библиотек, которые включают в себя такие вещи, как Glibmm / sigc ++ , но я думаю, что это слишком большой молоток для вашего ногтя. Как я полагаю, у вас уже есть библиотеки для работы, если они включают переносимое многопоточность и нет периодического таймера, вы можете разработать простой способ сделать это самостоятельно. Если требования к времени низки, просто запустите поток, который выполняет бесконечный цикл, который спит и вызывает ваш метод обратного вызова, когда он просыпается. Вы можете использовать sigc ++ , чтобы обрабатывать ваши обратные вызовы, так как это легко. Если у вас нет потоков и тому подобного и вы не хотите использовать boost, вы можете попробовать Glibmm . но если вы не хотите повышения, я полагаю, вам не понадобится и такая большая библиотека: -)

my2cents.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...