Russian Qt Forum
Ноябрь 22, 2024, 22:04
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
местоположение exec
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: местоположение exec (Прочитано 6150 раз)
ammaximus
Гость
местоположение exec
«
:
Октябрь 12, 2015, 11:40 »
В документации написано, что exec следует вызывать в главном потоке. И действительно если вызывать из qthread::run сигналы-слоты н е рабртают. Чем это вызвано и как работает? Можно ли вызывать exec в qthread или там только while (1)? Можно ли как то использовать сигналы слоты без exec в главном а только в дочеренм? Столкнулся с тем, что потоки не могут начать нормально работать, пока в главном не вызван exec, а в главном выполняются медленные задачи.
Записан
ammaximus
Гость
Re: местоположение exec
«
Ответ #1 :
Октябрь 12, 2015, 12:26 »
Смотрю все используют exec в Qthread, в документации написано что он ждет exit. Получается, что эти exec разные? А могу ли я в потоке вызвать qcoreapplication::exec, если в главном потоке он не вызывается?
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: местоположение exec
«
Ответ #2 :
Октябрь 12, 2015, 14:52 »
Цитата: ammaximus от Октябрь 12, 2015, 12:26
Смотрю все используют exec в Qthread, в документации написано что он ждет exit. Получается, что эти exec разные? А могу ли я в потоке вызвать qcoreapplication::exec, если в главном потоке он не вызывается?
QCoreApplication::exec вызывается 1 раз в начале программы (обычно в main.cpp), чтобы запустить всю систему. Это принципиальное условие, чтобы остальные объекты вашего приложения начали работать (в т.ч. потоки).
После этого QThread::exec можно вызывать где угодно в приложении, чтобы запустить данный конкретный поток.
«
Последнее редактирование: Октябрь 12, 2015, 14:54 от Racheengel
»
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
ammaximus
Гость
Re: местоположение exec
«
Ответ #3 :
Октябрь 12, 2015, 15:04 »
Меня интересует разница между этими экзеками, в доке написано что оба заходят в цикл опроса событий, так кто какие события получает и где обрабатываются сигналы /слоты?
Записан
ammaximus
Гость
Re: местоположение exec
«
Ответ #4 :
Октябрь 12, 2015, 15:10 »
Цитата: Racheengel от Октябрь 12, 2015, 14:52
Это принципиальное условие, чтобы остальные объекты вашего приложения начали работать (в т.ч. потоки).
Нет, потоки работают и без главного экзека (выполняется их run). Без главного не работают только сигналы/слоты.
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: местоположение exec
«
Ответ #5 :
Октябрь 12, 2015, 15:20 »
Цитата: ammaximus от Октябрь 12, 2015, 15:10
Цитата: Racheengel от Октябрь 12, 2015, 14:52
Это принципиальное условие, чтобы остальные объекты вашего приложения начали работать (в т.ч. потоки).
Нет, потоки работают и без главного экзека (выполняется их run). Без главного не работают только сигналы/слоты.
Ecли основной поток не запущен - как он тогда должен сигналы и слоты выполнять-то?
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: местоположение exec
«
Ответ #6 :
Октябрь 12, 2015, 15:21 »
Цитата: ammaximus от Октябрь 12, 2015, 15:04
Меня интересует разница между этими экзеками, в доке написано что оба заходят в цикл опроса событий, так кто какие события получает и где обрабатываются сигналы /слоты?
Каждый QThread имеет свой EventLoop который может быть запущен вызовом exec. Каждый QObject знает к какой QThread он относится, этим можно управлять с помощью пресловутого moveToThread. Если посылается сигнал с QueuedConnection то он закидывается в EventLoop той нитки которая установлена для приемника. Если посылается сигнал с AutoConnection то сверяется принадлежность приемника текущей нитке и если не совпадают - используется QueuedConnection, иначе DirectConnection. Все это уже жевалось столько что набило оскомину.
Вызывать QApplication::exec НЕ из главной - ну хз, вроде слышал работает и так. Обычно это саязывается с "запуском Qt из НЕ Qt приложения" Но сам не проверял т.к. оно и нафиг не надо, незачем искать приключений
Записан
ammaximus
Гость
Re: местоположение exec
«
Ответ #7 :
Октябрь 12, 2015, 15:25 »
Цитировать
Обычно это саязывается с "запуском Qt из НЕ Qt приложения"
Ага вот оно самое, спасибо )
Записан
ammaximus
Гость
Re: местоположение exec
«
Ответ #8 :
Октябрь 12, 2015, 15:35 »
Попробовал - не работает. Ну ладно, итак понятно что это плохая идея.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: местоположение exec
«
Ответ #9 :
Октябрь 12, 2015, 15:41 »
Цитата: ammaximus от Октябрь 12, 2015, 15:35
Попробовал - не работает. Ну ладно, итак понятно что это плохая идея.
Но зачем?
У нас есть QEventLoop, который позволит запустить обработку событий там где нужно и подключится он к очереди сообщений той нити в которой выполняется сам.
Записан
ammaximus
Гость
Re: местоположение exec
«
Ответ #10 :
Октябрь 12, 2015, 16:02 »
Старый код забивает главный поток тем, что сидит на сокете. Понадобилось подключить qt библиотеку, которая использует слоты для обмена внутри себя. Искал решение, чтобы не делать рефакторинг старого кода. Понятно, что правильнее вынести чтение сокета в отдельный поток, а в главном замутить exec, но сейчас это обойдется довольно дорого.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...