Название: Многократное выполнение 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'а должен быть связан со слотом stop() потока, а started() потока — со слотом, запускающим работу worker'a? И аналогично, если у worker'а есть два слота, выполняющих обработку (например, приблизительный и точный расчет), то достаточно по окончании обработки отвязывать сигналы, а при нажатии кнопки соединять сигнал started() с необходимым слотом.Настроили объект Worker, запустили нить с помощью start. Нужно запустить еще раз - start в помощь. Проверить состояние нити (запущена/нет) можно с помощью специальных флагов. Подумайте не удобнее ли вам будет использовать QtConcurent::run ? Ммм... не уверен, до этого с QtConcurrent не работал. Посмотрел пример и описание в Assistant'e, немного смущает невозможность информирования о процессе, а так выглядит интересно. Надо будет попробовать. |