Re: Отложенное выполнение задачи
От: zaufi Земля  
Дата: 05.10.15 10:25
Оценка: 6 (3)
Здравствуйте, 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 до начала запуска первой (топовой) задачи или втыкания новой задачи в очередь... -- все тривиально достаточно.
Re: Отложенное выполнение задачи
От: B0FEE664  
Дата: 05.10.15 11:31
Оценка: +1 :)
Здравствуйте, szag, Вы писали:

S>Есть поток, который выполняет задачи вброшенные к нему в очередь.

S>Теперь необходимо сделать так, чтобы задачи выполнялись отложено, интервал примерно 100..4000 мс в зависимости от вброшенной задачи, указывается при вбросе задачи.
S>??? другие идеи? Может есть что-то готовое?

boost::this_thread::sleep(boost::posix_time::milliseconds(100..4000)); в первой строчке каждой нитки, в зависимости от параметра.
И каждый день — без права на ошибку...
Re[2]: Отложенное выполнение задачи
От: Ops Россия  
Дата: 13.10.15 17:29
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>boost::this_thread::sleep(boost::posix_time::milliseconds(100..4000)); в первой строчке каждой нитки, в зависимости от параметра.


У него платформа четко обозначена, так что можно родной API использовать таким образом, тем более что boost.thread не header-only
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Отложенное выполнение задачи
От: szag  
Дата: 05.10.15 10:15
Оценка:
Есть поток, который выполняет задачи вброшенные к нему в очередь.
Теперь необходимо сделать так, чтобы задачи выполнялись отложено, интервал примерно 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, для оптимизации, ключ — это время, чтобы проверять не всю очередь.
??? другие идеи? Может есть что-то готовое?
Re: Отложенное выполнение задачи
От: BulatZiganshin  
Дата: 05.10.15 10:29
Оценка:
Здравствуйте, szag, Вы писали:

S>В #1 и #2 можно еще заюзать какой-нить map, для оптимизации, ключ — это время, чтобы проверять не всю очередь.

S>??? другие идеи? Может есть что-то готовое?

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

S> Может есть что-то готовое?


платформа-то хоть какая?
Люди, я люблю вас! Будьте бдительны!!!
Отредактировано 05.10.2015 10:34 BulatZiganshin . Предыдущая версия . Еще …
Отредактировано 05.10.2015 10:31 BulatZiganshin . Предыдущая версия .
Re: Отложенное выполнение задачи
От: so5team https://stiffstream.com
Дата: 06.10.15 06:47
Оценка:
Здравствуйте, szag, Вы писали:

S>Может есть что-то готовое?


Timer Thread Template -- маленькая header-only библиотека для C++11, с несколькими реализациями механизмов таймеров. В вашем случае может подойти как timer_thread (т.е. дополнительная нить, которая будет напоминать о сработавших таймерах), так и timer_manager (т.е. вы на одной нити сами узнаете, сколько осталось ждать до наступления следующего таймера).
Re[2]: Отложенное выполнение задачи
От: szag  
Дата: 07.10.15 04:54
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>Здравствуйте, szag, Вы писали:


S>>В #1 и #2 можно еще заюзать какой-нить map, для оптимизации, ключ — это время, чтобы проверять не всю очередь.

S>>??? другие идеи? Может есть что-то готовое?

BZ>используй priority_queue под мьютексом. после выполнения очередной задачи проверяй начало priority_queue, чтобы определить сколько нужно спать до следующей задачи. при добавлении проверяй и при необходимости буди тред-исполнитель


скорее всего так и сделаю.

S>> Может есть что-то готовое?


BZ>платформа-то хоть какая?

винда.
Re: Отложенное выполнение задачи
От: yetanotherplaceholder  
Дата: 08.10.15 08:44
Оценка:
Возможность отменять задачи нужна?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.