Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/10: Рейтинг темы: голосов - 10, средняя оценка - 4.50
Виталий Щ.
0 / 0 / 0
Регистрация: 20.11.2010
Сообщений: 66
#1

Многопоточность и GUI

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

День добрый. Подскажите, пожалуйста, как решить такую проблему:
Сейчас у нас в проекте есть библиотечка в которой реализованы все объекты, участвующие в построении интерфейса. Сейчас программа становится многопоточной и многопоточность реализуется с помощью QtConncurrent::run. Причем в зависимости от настроек системы задачи могут запускаться как в потоках , так и в главном потоке.
Естественно возникла проблема с GUI, который, как известно не в главном потоке использовать нельзя. Все GUI написано наследуя классы QT. Решено было попробовать перегрузить методы отвечающие за отрисовку таким образом, чтобы они посылали события в главный поток, а он уже рисовал.
Затык произошел с тем, что уже сталкиваясь с конструктором объекта наследованного от GUI виджета программа кричит о невозможности создания gui в потоке. Каким образом в конструкторе можно заставить конструкторы базового класса выполнится в главном потоке при том, что они выполняются раньше конструктора производного?
или может кто подскажет вообще какую то другую систему работы с ГУИ в многопоточном приложении. Задача все заморочки с гуи оставить в классах с гуи.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2013, 16:56
Ответы с готовыми решениями:

Как запустить qt gui программу, как демон, без gui, скрыв gui?
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер...

многопоточность в Qt
над qt первый день копчу, гуру подскажите как многопоточность здесь...

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

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

Многопоточность
Доброго всем времени суток!)))Мне необходимо было написать программу ,...

9
RazrFalcon
1385 / 1242 / 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
1385 / 1242 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
12.12.2013, 19:55 #4
Это настолько виснет? Просто я сталкивался когда нужно было почти каждый 10мс обновлять интерфейс - и тормозов особо не было.

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

Цитата Сообщение от Виталий Щ. Посмотреть сообщение
Да, но данные потом или в процессе выводятся на экран. В прогрессбары, системные сообщения и прочее.
для этого есть сигнал-слоты
1
Humanoid
Почетный модератор
9931 / 3833 / 343
Регистрация: 12.06.2008
Сообщений: 11,334
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
1385 / 1242 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
14.12.2013, 14:13 #8
maksimus1210, это опасная штука, она может нехило затормозить работу, оставив гуи отзывчивым...
0
Dmitriy_M
1415 / 1298 / 126
Регистрация: 20.03.2009
Сообщений: 4,629
Записей в блоге: 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
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
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

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

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

Многопоточность и network
Всем привет! Я сейчас пытаюсь написать программу для сбора сведений о...


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

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

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