Форум программистов, компьютерный форум, киберфорум
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Виталий Щ.
0 / 0 / 0
Регистрация: 20.11.2010
Сообщений: 66
#1

Многопоточность и GUI - C++ Qt

12.12.2013, 16:56. Просмотров 1933. Ответов 9
Метки нет (Все метки)

День добрый. Подскажите, пожалуйста, как решить такую проблему:
Сейчас у нас в проекте есть библиотечка в которой реализованы все объекты, участвующие в построении интерфейса. Сейчас программа становится многопоточной и многопоточность реализуется с помощью QtConncurrent::run. Причем в зависимости от настроек системы задачи могут запускаться как в потоках , так и в главном потоке.
Естественно возникла проблема с GUI, который, как известно не в главном потоке использовать нельзя. Все GUI написано наследуя классы QT. Решено было попробовать перегрузить методы отвечающие за отрисовку таким образом, чтобы они посылали события в главный поток, а он уже рисовал.
Затык произошел с тем, что уже сталкиваясь с конструктором объекта наследованного от GUI виджета программа кричит о невозможности создания gui в потоке. Каким образом в конструкторе можно заставить конструкторы базового класса выполнится в главном потоке при том, что они выполняются раньше конструктора производного?
или может кто подскажет вообще какую то другую систему работы с ГУИ в многопоточном приложении. Задача все заморочки с гуи оставить в классах с гуи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2013, 16:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Многопоточность и GUI (C++ Qt):

Как запустить qt gui программу, как демон, без gui, скрыв gui? - C++ Qt
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер выполняет определенные действия, и нужно запустить этот...

многопоточность в Qt - C++ Qt
над qt первый день копчу, гуру подскажите как многопоточность здесь реализуется, omp или boost не подключаются?

Многопоточность - C++ Qt
Доброго времени суток! Прокомментируйте пожалуйста данный код по использованию потоков. В чем его минусы? Какие могут быть проблемы? ...

Многопоточность в QT - C++ Qt
Нужно мне написать консольную программу, которая выводит на экран оптимальное количество потоков, которые можно запустить на данном...

Многопоточность - Кроссплатформенная разработка
Доброго всем времени суток!)))Мне необходимо было написать программу , порождающую четыре потока, каждому из которых выделяется четвертая...

QTimer и многопоточность - C++ Qt
К серверу подключаются несколько клиентов и начинают передавать данные. Данные с каждого клиента на сервер передаются в отдельном потоке и...

9
RazrFalcon
1382 / 1239 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
12.12.2013, 19:29 #2
Работать с гуи вне основного потока в Qt нельзя в принципе.
В потоках обычно выполняют обработку данных, зачем там обрабатывать еще и гуи?
1
Виталий Щ.
0 / 0 / 0
Регистрация: 20.11.2010
Сообщений: 66
12.12.2013, 19:35  [ТС] #3
Да, но данные потом или в процессе выводятся на экран. В прогрессбары, системные сообщения и прочее.
0
RazrFalcon
1382 / 1239 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
12.12.2013, 19:55 #4
Это настолько виснет? Просто я сталкивался когда нужно было почти каждый 10мс обновлять интерфейс - и тормозов особо не было.

В любом случае гуи только в основном потоке. Если уж очень виснет - то лучше попробовать уменьшить частоту обновления данных от потоков.
0
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.12.2013, 14:48 #5
Цитата Сообщение от Виталий Щ. Посмотреть сообщение
Каким образом в конструкторе можно заставить конструкторы базового класса выполнится в главном потоке при том, что они выполняются раньше конструктора производного?
это ж чем надо укуриться чтоб до такого дойти. бизнес логиrа не должна зависеть от gui

Цитата Сообщение от Виталий Щ. Посмотреть сообщение
Да, но данные потом или в процессе выводятся на экран. В прогрессбары, системные сообщения и прочее.
для этого есть сигнал-слоты
1
Humanoid
Почетный модератор
9877 / 3778 / 175
Регистрация: 12.06.2008
Сообщений: 11,200
13.12.2013, 21:10 #6
Цитата Сообщение от Виталий Щ. Посмотреть сообщение
Да, но данные потом или в процессе выводятся на экран. В прогрессбары, системные сообщения и прочее.
Просто их не надо так часто обновлять. 10 раз в секунду уже будет достаточно плавно выглядеть и в то же время не будет затормаживать систему.
0
maksimus1210
5 / 5 / 1
Регистрация: 23.02.2013
Сообщений: 24
14.12.2013, 13:33 #7
Если бывает ситуация, когда в основном потоке выполняется долгая задача, то как вариант можно использовать такую структуру:

C++ (Qt)
1
2
3
4
5
6
7
for( ; ; )
{
    // что то делаем...
 
    // после каждой итерации вызываем обработку системных сообщений, которые накопились за это время (GUI при этом тоже откликается)
    qApp->processEvents();
}
0
RazrFalcon
1382 / 1239 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
14.12.2013, 14:13 #8
maksimus1210, это опасная штука, она может нехило затормозить работу, оставив гуи отзывчивым...
0
Dmitriy_M
1371 / 1254 / 114
Регистрация: 20.03.2009
Сообщений: 4,477
Записей в блоге: 11
14.12.2013, 14:45 #9
Цитата Сообщение от maksimus1210 Посмотреть сообщение
Если бывает ситуация, когда в основном потоке выполняется долгая задача, то как вариант можно использовать такую структуру:

C++ (Qt)
1
2
3
4
5
6
7
for( ; ; )
{
    // что то делаем...
 
    // после каждой итерации вызываем обработку системных сообщений, которые накопились за это время (GUI при этом тоже откликается)
    qApp->processEvents();
}
QtConcurrentRun+QFutureWatcher+QEventLoop(опционально)
0
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
14.12.2013, 14:56 #10
Цитата Сообщение от Виталий Щ. Посмотреть сообщение
Естественно возникла проблема с GUI, который, как известно не в главном потоке использовать нельзя.
Гуй отлично работает из любого потока, но требует синхронизации. Единственное ограничение - вторичные потоки не получают сообщений из системы и через систему. Но получив сообщение в первичном потоке, можно из него выполнить запись в переменные, читаемые вторичными потоками.
0
14.12.2013, 14:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 14:56
Привет! Вот еще темы с ответами:

QML/C++ и многопоточность - C++ Qt
Всем привет! Помогите разобраться и решить следующую пролему. Мне надо соединить сишную часть и qml. Если мы находимся в одном потоке,...

Многопоточность и network - C++ Qt
Всем привет! Я сейчас пытаюсь написать программу для сбора сведений о торрентах, т.е. написать фактически парсер. Я не знаю какой метод...

Qt, libfcgi и многопоточность - C++ Qt
Привет Всем. Прочитал в одной статье "Блокирования событий при использовании libfcgi в многопоточном режиме", что "плодить потоки до...

Многопоточность и Mutex - C++ Qt
Мне помогли написать код который ищет максимум многопоточно, и посоветовали сделать поиск максимума главным потоком через Mutex, я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.