2016-01-29 8 views
1

Вот кусок Threads and QObjects doc из QtQt излучения сигнала и исполнение QThread расхода

Прямое соединение Слот вызывается немедленно, когда сигнал, излучаемый . Слот выполняется в потоке эмиттера, который не равен потоку получателя.

Так давайте признаемся я застрял в

while (this->true_bool); 

в потоке 1, и thread2 излучает сигнал, подключенный к пазу «этого» объекта выше линии, она будет выполнена после выхода цикла (так никогда) или он будет выполнен немедленно и после того, как слот вернется, он вернется к while (поэтому, если я изменил this-> true_bool на false, он закончит цикл)?

Мне кажется странным, что это вызовет немедленный вызов слота, но документы, похоже, говорят об этом.

ответ

3

Это будет выполняться непосредственно в thread2, независимо от цикла в thread1.

... Слот выполняется в потоке эмиттера, который не обязательно нить приемника ...

EDIT: Я думаю, что ответ о QThread будет полезно для вас : https://stackoverflow.com/a/35056527/4149835

2

Qt называет работу следующим образом:

  • Прямое подключение. Всякий раз, когда у вас есть прямое соединение, вызов emit выполняет следующее: перечисляет все подключенные слоты и вызывает их по очереди. Слоты - это функции, и они вызываются сразу во время вызова emit. Итак, как только emit Something() завершает работу, все подключенные к нему слоты были выполнены. Подумайте об этом как о массиве указателей функций, которые выполняются один за другим во время разговора. Таким образом, все слоты выполняются в том же потоке, который вы называете сигналом.
  • Очередное подключение. Он похож на прямое соединение, но вместо вызова каждого слота он отправляет его в очередь объекта, связанного с каждым слотом. Следовательно, слот запускается циклом события, с которым связан целевой объект. И поэтому он запускается потоком, в котором целевой объект живет не тем, на который был вызван сигнал (в случае, если потоки для целевого объекта и вызов сигнала не совпадают). Поэтому, когда вызов сигнала завершается, это означает, что для всех связанных в очереди соединений QEvents были отправлены в соответствующие очереди, но это не значит, что слоты были выполнены еще.