Qt основано на очередях событий. Каждый поток Qt имеет свою очередь и связанный с ней цикл обработки событий. Таким образом, когда у вас есть ситуация, когда два разных объекта живут, это два разных потока, и один из них связан с другим через механизм сигналов / слотов (либо через автоматическое, либо через очередь), во время передачи происходит следующее: код внутри сигнала создает событие и отправляет его в очередь объекта-получателя. Цикл событий получателя проходит через очередь, находит опубликованное событие и выполняет соответствующий слот.
Очередь гарантированно безопасна для потоков, поэтому абсолютно безопасно излучать сигналы между потоками. Цитата в ваших вопросах говорит о ситуации, когда вы делаете прямой вызов на объекте, живущем в T1
от T2
.
Существует замечательная статья о потоках, объектах, сигналах, слотах и о том, как все связано друг с другом: События потоков QObjects . Я рекомендую прочитать это, если вы хотите понять это глубже.
Относительно рассматриваемого кода. У вас есть соединение в очереди, и это означает, что не имеет значения, живут ли отправитель и получатель в одном потоке или в разных. Не имеет значения, являются ли отправитель и получатель двумя объектами или одинаковыми. Упомянутая рутина будет такой же. Если вы создали автоматическое соединение, то оно будет иметь прямой вызов, но вы этого не сделали. И соответствующую цитату из документации :
С другой стороны, вы можете безопасно излучать сигналы от вашего
Реализация QThread :: run (), , потому что излучение сигнала потокобезопасно .