Russian Qt Forum
Ноябрь 22, 2024, 21:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: местоположение exec  (Прочитано 6144 раз)
ammaximus
Гость
« : Октябрь 12, 2015, 11:40 »

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

Смотрю все используют exec в Qthread, в документации написано что он ждет exit. Получается, что эти exec разные? А могу ли я в потоке вызвать qcoreapplication::exec, если в главном потоке он не вызывается?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Октябрь 12, 2015, 14:52 »

Смотрю все используют 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
Гость
« Ответ #3 : Октябрь 12, 2015, 15:04 »

Меня интересует разница между этими экзеками, в доке написано что оба заходят в цикл опроса событий, так кто какие события получает и где обрабатываются сигналы /слоты?
Записан
ammaximus
Гость
« Ответ #4 : Октябрь 12, 2015, 15:10 »

Это принципиальное условие, чтобы остальные объекты вашего приложения начали работать (в т.ч. потоки).
Нет, потоки работают и без главного экзека (выполняется их run). Без главного не работают только сигналы/слоты.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Октябрь 12, 2015, 15:20 »

Это принципиальное условие, чтобы остальные объекты вашего приложения начали работать (в т.ч. потоки).
Нет, потоки работают и без главного экзека (выполняется их 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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 12, 2015, 15:21 »

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

Вызывать  QApplication::exec НЕ из главной - ну хз, вроде слышал работает и так. Обычно это саязывается с "запуском Qt из НЕ Qt приложения" Но сам не проверял т.к. оно и нафиг не надо, незачем искать приключений
Записан
ammaximus
Гость
« Ответ #7 : Октябрь 12, 2015, 15:25 »

Цитировать
Обычно это саязывается с "запуском Qt из НЕ Qt приложения"
Ага вот оно самое, спасибо )
Записан
ammaximus
Гость
« Ответ #8 : Октябрь 12, 2015, 15:35 »

Попробовал - не работает. Ну ладно, итак понятно что это плохая идея.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Октябрь 12, 2015, 15:41 »

Попробовал - не работает. Ну ладно, итак понятно что это плохая идея.
Но зачем?
У нас есть QEventLoop, который позволит запустить обработку событий там где нужно и подключится он к очереди сообщений той нити в которой выполняется сам.
Записан
ammaximus
Гость
« Ответ #10 : Октябрь 12, 2015, 16:02 »

Старый код забивает главный поток тем, что сидит на сокете. Понадобилось подключить qt библиотеку, которая использует слоты для обмена внутри себя. Искал решение, чтобы не делать рефакторинг старого кода. Понятно, что правильнее вынести чтение сокета в отдельный поток, а в главном замутить exec, но сейчас это обойдется довольно дорого.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 23.