C / C ++ тактовый вопрос - PullRequest
2 голосов
/ 05 мая 2011

У меня такая проблема для разработки.

Два события A, B.

A будут выполняться каждые 3,2 секунды, B будут выполняться каждые 1,7 секунды,

Iхочу использовать usleep () для реализации синхронизации.И должен ли я также разветвлять 2 потока для подсчета времени одновременно?Или я просто усну 1,7 секунды, а затем усну 1,5 секунды?и продолжается ???Что лучше?И какие еще ситуации я должен рассмотреть?Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Вы можете использовать Усиливает асинхронные таймеры .В связанном примере два потока таймера (один из них является основным) работают одновременно в установленный период, в данном случае со скоростью один раз в секунду.Чтобы они запускались на 3,2 и 1,7 секунды соответственно, измените строку, которая гласит:

timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));

, чтобы она запускалась каждые 3,2 секунды:

timer1_.expires_at(timer1_.expires_at() + boost::posix_time::millisec(3200));
3 голосов
/ 05 мая 2011

Сколько времени нужно для запуска событий?Если времени больше, чем совсем нет, сон между каждым из них будет означать, что события не будут выполняться каждые x секунд, где x - время, в течение которого вы спите.Например, если событие занимает 1,2 секунды, а вы спите в течение 1,7, оно будет запускаться каждые 2,9 секунды.Колебание времени, которое требуется, затруднит определение времени запуска каждого события.

Вы можете противодействовать этому, либо измерив время, которое вы взяли, и вычтя его из времени ожидания (1.7 - 1.2 = 0.5, поэтомуВы спите в течение 0,5 секунд), или используя три потока: один для запуска события A, один для запуска события B и один для определения времени.Вы можете создать поток для каждого события, которое завершается после его завершения, или у вас может быть один или несколько постоянных потоков, которые принимают задания для запуска.Первый вариант означает, что вам не нужно беспокоиться о параллелизме (потому что параллелизм сложен).

Если есть вероятность, что события займут больше времени, чем вы ожидаете, вы должны убедиться, что вы не 't запустить событие A снова, пока оно еще выполняется с предыдущей итерации.Если вы используете одну нить и спите, об этом позаботятся за вас.Если вы пойдете по маршруту нескольких потоков, вы можете избежать этого, создав очередь и поместив в нее задания, но тогда вам нужно убедиться, что вы не создадите массивную очередь дублирующихся заданий, что можно сделать одним из следующих способов:не ставить в очередь задание, если оно уже находится в очереди, или перезаписывать существующие задания для того же события (в зависимости от того, должны ли более поздние задания превосходить предыдущие).

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