Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: voltron от Октябрь 28, 2013, 20:54



Название: Многократное выполнение worker'a в QThread
Отправлено: voltron от Октябрь 28, 2013, 20:54
Хочу реулизовать следующее поведение. Есть длительная операция, которую пользователь может запускать в процессе работы неограниченное число раз, но только в одном экземпляре. Т.е. запустил операцию, получил результат и только потом можно запускать ещё раз с теми же или другими данными.

Реализовать планирую путём создания и вынесения в отдельный поток наследника QObject, который будет заниматься расчетами. Примерно так, как описано здесь (http://www.prog.org.ru/index.php?topic=17090.msg114452#msg114452). Т.к. выполняться расчеты будут неоднократно, хотелось бы не создавать при каждом нажатии кнопки новые экземпляры worker'а и потока, а создать их единожды, чтобы после окончания вычислений поток переходил в «режим ожидания», а при поступлении сигнала начинал новый расчет.

Можно ли сделать такое и если да, то как? В случае наследования QThread, можно использовать sleep() и флаги, а вот как быть с объектом не очень представляю.


Название: Re: Многократное выполнение worker'a в QThread
Отправлено: Old от Октябрь 28, 2013, 21:45
А в чем проблемы?
Настроили объект Worker, запустили нить с помощью start. Нужно запустить еще раз - start в помощь. Проверить состояние нити (запущена/нет) можно с помощью специальных флагов.


Название: Re: Многократное выполнение worker'a в QThread
Отправлено: LisandreL от Октябрь 28, 2013, 23:30
Подумайте не удобнее ли вам будет использовать QtConcurent::run ?


Название: Re: Многократное выполнение worker'a в QThread
Отправлено: voltron от Октябрь 29, 2013, 12:28
А в чем проблемы?
Настроили объект Worker, запустили нить с помощью start. Нужно запустить еще раз - start в помощь. Проверить состояние нити (запущена/нет) можно с помощью специальных флагов.
Спасибо. Т.е. я правильно понимаю, что в таком случае сигнал окончания обработки от worker'а должен быть связан со слотом stop() потока, а started() потока — со слотом, запускающим работу worker'a? И аналогично, если у worker'а есть два слота, выполняющих обработку (например, приблизительный и точный расчет), то достаточно по окончании обработки отвязывать сигналы, а при нажатии кнопки соединять сигнал started() с необходимым слотом.

Подумайте не удобнее ли вам будет использовать QtConcurent::run ?
Ммм... не уверен, до этого с QtConcurrent не работал. Посмотрел пример и описание в Assistant'e, немного смущает невозможность информирования о процессе, а так выглядит интересно. Надо будет попробовать.