Есть поток, который выполняет задачи вброшенные к нему в очередь.
Теперь необходимо сделать так, чтобы задачи выполнялись отложено, интервал примерно 100..4000 мс в зависимости от вброшенной задачи, указывается при вбросе задачи.
void push(task, uint32_t timeout); // с таймаутом
1. Сразу хочется заюзать boost::deadline_timer , на каждую задачу создавать свой таймер. (на первый взгляд стремно)
2. Заюзать вариант #1, но только один таймер для всех задач, с интервалом, скажем в 10-50мс и проверять если ли задачи, готовые к выполнению.
3. timed_mutex: срабатывающий condition_variable по таймеру или по notify (добавление новой задачи). Тогда по каждому событию проверять всю очередь и выполнять задачи, таймаут которых подошел.
В #1 и #2 можно еще заюзать какой-нить map, для оптимизации, ключ — это время, чтобы проверять не всю очередь.
??? другие идеи? Может есть что-то готовое?
Здравствуйте, szag, Вы писали:
S>Есть поток, который выполняет задачи вброшенные к нему в очередь. S>Теперь необходимо сделать так, чтобы задачи выполнялись отложено, интервал примерно 100..4000 мс в зависимости от вброшенной задачи, указывается при вбросе задачи. S>
S>void push(task, uint32_t timeout); // с таймаутом
S>
S>3. timed_mutex: срабатывающий condition_variable по таймеру или по notify (добавление новой задачи). Тогда по каждому событию проверять всю очередь и выполнять задачи, таймаут которых подошел. S>В #1 и #2 можно еще заюзать какой-нить map, для оптимизации, ключ — это время, чтобы проверять не всю очередь. S>??? другие идеи? Может есть что-то готовое?
при постановке задачи в в очередь вычисляешь время, когда ее нужно запустить. очередь делаешь с приоритетом (время запуска). новые задачи втыкаешь в порядке приоритета. спишь на condition'e до начала запуска первой (топовой) задачи или втыкания новой задачи в очередь... -- все тривиально достаточно.
Здравствуйте, szag, Вы писали:
S>В #1 и #2 можно еще заюзать какой-нить map, для оптимизации, ключ — это время, чтобы проверять не всю очередь. S>??? другие идеи? Может есть что-то готовое?
используй priority_queue под мьютексом. после выполнения очередной задачи проверяй начало priority_queue, чтобы определить сколько нужно спать до следующей задачи. при добавлении проверяй и при необходимости буди тред-исполнитель
S> Может есть что-то готовое?
Здравствуйте, szag, Вы писали:
S>Есть поток, который выполняет задачи вброшенные к нему в очередь. S>Теперь необходимо сделать так, чтобы задачи выполнялись отложено, интервал примерно 100..4000 мс в зависимости от вброшенной задачи, указывается при вбросе задачи. S>??? другие идеи? Может есть что-то готовое?
boost::this_thread::sleep(boost::posix_time::milliseconds(100..4000)); в первой строчке каждой нитки, в зависимости от параметра.
Здравствуйте, szag, Вы писали:
S>Может есть что-то готовое?
Timer Thread Template -- маленькая header-only библиотека для C++11, с несколькими реализациями механизмов таймеров. В вашем случае может подойти как timer_thread (т.е. дополнительная нить, которая будет напоминать о сработавших таймерах), так и timer_manager (т.е. вы на одной нити сами узнаете, сколько осталось ждать до наступления следующего таймера).
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, szag, Вы писали:
S>>В #1 и #2 можно еще заюзать какой-нить map, для оптимизации, ключ — это время, чтобы проверять не всю очередь. S>>??? другие идеи? Может есть что-то готовое?
BZ>используй priority_queue под мьютексом. после выполнения очередной задачи проверяй начало priority_queue, чтобы определить сколько нужно спать до следующей задачи. при добавлении проверяй и при необходимости буди тред-исполнитель
скорее всего так и сделаю.
S>> Может есть что-то готовое?
BZ>платформа-то хоть какая?
винда.
Здравствуйте, B0FEE664, Вы писали:
BFE>boost::this_thread::sleep(boost::posix_time::milliseconds(100..4000)); в первой строчке каждой нитки, в зависимости от параметра.
У него платформа четко обозначена, так что можно родной API использовать таким образом, тем более что boost.thread не header-only
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.