Russian Qt Forum
Ноябрь 26, 2024, 00:19
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Длительные операции + QtConcurrent
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Длительные операции + QtConcurrent (Прочитано 8486 раз)
Nidxogg
Гость
Длительные операции + QtConcurrent
«
:
Сентябрь 23, 2014, 18:17 »
Добрый день.
Есть gui-программа, работающая с БД. Все запросы и т.д вынесены в отдельный класс.
Все работает в одном потоке.
Есть такой псевдокод, который должен выполнится строго в заданной последовательности.
Код:
void MyClass::myMethod()
{
func1();
func2();
func3();
}
Собственно func2() выполняется довольно долго, поэтому решил на время фриза интерфейса добавить гифку-прогрессбар(+QMovie) .
Гифка, естественно, не анимируется в процессе выполнения func2(). processEvent() не помог.
Тогда решил выполнить func2() в отдельном потоке с использованием QtConcurrent::run(...), гифка ожила, но теперь func3() начинает выполняться до окончания func2();
Пробовал использовать waitForFinished, но опять столкнулся с фризом интерфейса.
Может у кого-нибудь есть идеи как выйти из ситуации?
Записан
Bepec
Гость
Re: Длительные операции + QtConcurrent
«
Ответ #1 :
Сентябрь 23, 2014, 18:22 »
Видимо вы как то не так делали processEvents
Всё должно работать без фризов.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Длительные операции + QtConcurrent
«
Ответ #2 :
Сентябрь 23, 2014, 18:23 »
Запускайте func3 в слоте, который будет вызываться при завершении потока, выполняющего func2.
Записан
Nidxogg
Гость
Re: Длительные операции + QtConcurrent
«
Ответ #3 :
Сентябрь 23, 2014, 18:44 »
Цитировать
Запускайте func3 в слоте, который будет вызываться при завершении потока, выполняющего func2.
Вы имеет ввиду соединить сигнал finished() от QFutureWatcher со слотом, и вызывать func3() там?
прим.: мне приходит несколько пакетов по сети практически одновременно, которые необходимо обработать.
В слоте я вызываю myMethod и рассчитываю, что обработка следующего пакета не начнется, пока не завершится обработка текущего (собственно так и работает, т.к все в одном потоке(если без QtConcurent)).
Не получился ли, что я вызову myMethod раньше, чем завершится выполнение func3()?
Цитировать
Видимо вы как то не так делали processEvents Всё должно работать без фризов.
У меня прозрачный виджет ставится, аналог вашего sbglass (qlightboxwidget в гугле), на который кидается QLabel и гифка.
processEvents вызываю qApp->processEvents() во время обработки запроса из БД (Порядка 150 раз в течение ~5 секунд);
«
Последнее редактирование: Сентябрь 23, 2014, 18:48 от Nidxogg
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Длительные операции + QtConcurrent
«
Ответ #4 :
Сентябрь 23, 2014, 18:52 »
Цитата: Nidxogg от Сентябрь 23, 2014, 18:17
Гифка, естественно, не анимируется в процессе выполнения func2(). processEvent() не помог.
Не вижу здесь ничего естественного, надо разбираться. Вообще запуск потока только с целью обеспечить индикатор не есть хорошо/грамотно.
Записан
Nidxogg
Гость
Re: Длительные операции + QtConcurrent
«
Ответ #5 :
Сентябрь 23, 2014, 19:25 »
Цитировать
Не вижу здесь ничего естественного, надо разбираться
Главный поток загружен операциями в func2, интерфейс зафрижен.
Что не так?
Записан
Bepec
Гость
Re: Длительные операции + QtConcurrent
«
Ответ #6 :
Сентябрь 23, 2014, 20:58 »
Не так, что достаточно 25 раз в секунду вызывать processEvents чтобы пользователь вообще ничего не заподозрил.
Значит вы его вызываете или не там, или не так
Т.е. вот такое высказывание верно:
Главный поток загружен операциями в func2, где вызывается processEvents, интерфейс работает нормально.
Записан
VPS
Гость
Re: Длительные операции + QtConcurrent
«
Ответ #7 :
Сентябрь 23, 2014, 22:58 »
Что Вам мешает все три метода обработки данных запускать последовательно в отдельном потоке, а принимаемые пакеты из главного (GUI или другого) потока передавать туда на обработку? В данном случае, для передачи пакетов, можно попробовать использовать сигналы или библиотеку, в которой есть потокобезопасная очередь. Т.е. получится что-то типа шаблона Producer-Consumer.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Длительные операции + QtConcurrent
«
Ответ #8 :
Сентябрь 24, 2014, 06:19 »
Цитата: Nidxogg от Сентябрь 23, 2014, 19:25
Главный поток загружен операциями в func2, интерфейс зафрижен.
Что не так?
А что "так"?
То что есть интенсивный расчет - еще не основание выносить его в отдельный поток. Вот напр если 2 расчета параллельно - тогда да. А так гораздо проще вызывать processEvents в теле расчета. 25 раз в сек - ну это для видео, а для UI достаточно и 5 раз. Попробуйте вместо гифки напр QProgressDialog, убедитесь что он работает, а потом и до гифки дело дойдет.
Записан
qate
Супер
Offline
Сообщений: 1177
Re: Длительные операции + QtConcurrent
«
Ответ #9 :
Сентябрь 24, 2014, 11:40 »
QtConcurrent::run(myMethod) - не ?
вызывать руками процессевентс - это самому себе грабли раскидывать
Записан
OKTA
Гость
Re: Длительные операции + QtConcurrent
«
Ответ #10 :
Сентябрь 24, 2014, 12:08 »
Если планируется расширение в дальнейшем, то вынеси весь класс работы с БД в отдельный поток и не мучайся, а то так или processEvents везде распихивать или QtConcurrent::run постоянно дергать, если появятся новые тяжелые функции.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Длительные операции + QtConcurrent
«
Ответ #11 :
Сентябрь 24, 2014, 12:34 »
Цитата: OKTA от Сентябрь 24, 2014, 12:08
или QtConcurrent::run постоянно дергать, если появятся новые тяжелые функции.
Ну так он именно для этого и сделан.
Он запускает пул потоков и нагружает их когда в этом есть необходимость.
Записан
OKTA
Гость
Re: Длительные операции + QtConcurrent
«
Ответ #12 :
Сентябрь 24, 2014, 12:38 »
Так-то да, но когда их много, могут быть проблемы с управлением
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Длительные операции + QtConcurrent
«
Ответ #13 :
Сентябрь 24, 2014, 12:40 »
Цитата: OKTA от Сентябрь 24, 2014, 12:38
Так-то да, но когда их много, могут быть проблемы с управлением
Проблемы с управлением могут быть только когда написано так, что есть проблемы с управлением, а так проблем с управлением быть не должно.
Записан
OKTA
Гость
Re: Длительные операции + QtConcurrent
«
Ответ #14 :
Сентябрь 24, 2014, 12:49 »
Это в идеальном варианте
А так, например большая проблема QtConcurrentRun, что не остановишь его человеческим способом, когда потребуется. Вызывает геморрой, которого можно избежать, выделив все это барахло в честный отдельный поток
Во всяком случае лично меня всегда это коробило и я стараюсь пользоваться QtConucrrentRun только в случае небольших функций
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...