Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: ammaximus от Октябрь 12, 2015, 11:40



Название: местоположение exec
Отправлено: ammaximus от Октябрь 12, 2015, 11:40
В документации написано, что exec следует вызывать в главном потоке. И действительно если вызывать из qthread::run сигналы-слоты н е рабртают. Чем это вызвано и как работает? Можно ли вызывать exec в qthread или там только while (1)? Можно ли как то использовать сигналы слоты без exec в главном а только в дочеренм? Столкнулся с тем, что потоки не могут начать нормально работать, пока в главном не вызван exec, а в главном выполняются  медленные задачи.


Название: Re: местоположение exec
Отправлено: ammaximus от Октябрь 12, 2015, 12:26
Смотрю все используют exec в Qthread, в документации написано что он ждет exit. Получается, что эти exec разные? А могу ли я в потоке вызвать qcoreapplication::exec, если в главном потоке он не вызывается?


Название: Re: местоположение exec
Отправлено: Racheengel от Октябрь 12, 2015, 14:52
Смотрю все используют exec в Qthread, в документации написано что он ждет exit. Получается, что эти exec разные? А могу ли я в потоке вызвать qcoreapplication::exec, если в главном потоке он не вызывается?

QCoreApplication::exec вызывается 1 раз в начале программы (обычно в main.cpp), чтобы запустить всю систему. Это принципиальное условие, чтобы остальные объекты вашего приложения начали работать (в т.ч. потоки).

После этого QThread::exec можно вызывать где угодно в приложении, чтобы запустить данный конкретный поток.


Название: Re: местоположение exec
Отправлено: ammaximus от Октябрь 12, 2015, 15:04
Меня интересует разница между этими экзеками, в доке написано что оба заходят в цикл опроса событий, так кто какие события получает и где обрабатываются сигналы /слоты?


Название: Re: местоположение exec
Отправлено: ammaximus от Октябрь 12, 2015, 15:10
Это принципиальное условие, чтобы остальные объекты вашего приложения начали работать (в т.ч. потоки).
Нет, потоки работают и без главного экзека (выполняется их run). Без главного не работают только сигналы/слоты.


Название: Re: местоположение exec
Отправлено: Racheengel от Октябрь 12, 2015, 15:20
Это принципиальное условие, чтобы остальные объекты вашего приложения начали работать (в т.ч. потоки).
Нет, потоки работают и без главного экзека (выполняется их run). Без главного не работают только сигналы/слоты.

Ecли основной поток не запущен - как он тогда должен сигналы и слоты выполнять-то?


Название: Re: местоположение exec
Отправлено: Igors от Октябрь 12, 2015, 15:21
Меня интересует разница между этими экзеками, в доке написано что оба заходят в цикл опроса событий, так кто какие события получает и где обрабатываются сигналы /слоты?
Каждый QThread имеет свой EventLoop который может быть запущен вызовом exec. Каждый QObject знает к какой QThread он относится, этим можно управлять с помощью пресловутого moveToThread. Если посылается сигнал с QueuedConnection то он закидывается в EventLoop той нитки которая установлена для приемника. Если посылается сигнал с AutoConnection то сверяется принадлежность приемника текущей нитке и если не совпадают - используется QueuedConnection, иначе DirectConnection. Все это уже жевалось столько что набило оскомину.

Вызывать  QApplication::exec НЕ из главной - ну хз, вроде слышал работает и так. Обычно это саязывается с "запуском Qt из НЕ Qt приложения" Но сам не проверял т.к. оно и нафиг не надо, незачем искать приключений


Название: Re: местоположение exec
Отправлено: ammaximus от Октябрь 12, 2015, 15:25
Цитировать
Обычно это саязывается с "запуском Qt из НЕ Qt приложения"
Ага вот оно самое, спасибо )


Название: Re: местоположение exec
Отправлено: ammaximus от Октябрь 12, 2015, 15:35
Попробовал - не работает. Ну ладно, итак понятно что это плохая идея.


Название: Re: местоположение exec
Отправлено: Old от Октябрь 12, 2015, 15:41
Попробовал - не работает. Ну ладно, итак понятно что это плохая идея.
Но зачем?
У нас есть QEventLoop, который позволит запустить обработку событий там где нужно и подключится он к очереди сообщений той нити в которой выполняется сам.


Название: Re: местоположение exec
Отправлено: ammaximus от Октябрь 12, 2015, 16:02
Старый код забивает главный поток тем, что сидит на сокете. Понадобилось подключить qt библиотеку, которая использует слоты для обмена внутри себя. Искал решение, чтобы не делать рефакторинг старого кода. Понятно, что правильнее вынести чтение сокета в отдельный поток, а в главном замутить exec, но сейчас это обойдется довольно дорого.