Когда использовать QThread :: exec () - PullRequest
4 голосов
/ 07 октября 2010

Я проверил удовлетворительное объяснение, но не смог найти.Обычно в документах упоминается, что для использования сигналов / слотов между потоками нам нужно использовать циклы событий и запускать их, вызывая exec.

Однако я вижу, что без использования exec () я все еще могу отправитьсигналы и обрабатывать их через потоки.

Каково его точное использование?

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Используйте QThread::exec(), если вы хотите запустить цикл обработки событий, предоставляемый Qt в классе QThread.Если вы не вызываете exec (), вам нужно создать свой собственный цикл обработки событий, который обрабатывает события Qt (то есть, если вы хотите, чтобы сигналы / слоты работали).Это почти наверняка больше работы, чем стоит, если только у вас нет особых потребностей.

Вы говорите, что можете отправлять сигналы / слоты?Я предполагаю, что вы на самом деле ничего не запускаете в другом потоке.Это очень распространенная проблема при использовании QThread.Поместите точку останова в код, который, по вашему мнению, выполняется в другом потоке, и посмотрите на трассировку стека - возможно, вас ждет шок!

2 голосов
/ 07 октября 2010

Грубый пример.

Предположим, у вас есть текстовое поле.На каждом письме пользователь вводит текстовое поле, которое вы хотите выполнить в фоновом режиме.Вы можете установить QThread для этого.Испускать что-то всякий раз, когда содержимое текстового поля изменяется.Назначьте слот из вашего QThread, который обрабатывает фоновую задачу.Издайте что-нибудь из QThread, когда задание будет выполнено.Обработайте этот сигнал из основного потока.Соедини их.Запустите поток, когда текстовое поле будет создано (или в любое другое подходящее время).Если вы звоните exec() с вашего QThread::run(), то вам не нужно start() нить несколько раз.

Если вы не используете этот механизм, вам может потребоваться создать (и / илиstart()) a QThread каждый раз, когда изменяется содержимое текстового поля, выполните фоновое задание и получите результат.На этот раз вы все еще можете использовать сигнал / слот между основным потоком и этим потоком, но вам нужно start() поток несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...