Задать вопрос
@pixik

Как работает механизм signal-slot QT, если нужно сигнал из объекта одного потока передать в слот объекту другого потока?

Всем привет!
Сам по себе принцып работы сигнал-слот в qt мне понятен (когда один объект передаёт сигнал в слот дургого объекта в одном потоке). Совсем запутался, когда попытался разобраться, как же мне из объекта, находящегося в одном потоке, передать сигнал в слот объекту, находящегося в другом потоке.
Кто разбирается, объясните пожалуйста. Внятной информации нагуглить не получилось, кроме той, которая окончательно меня запутала.
Спасибо!
  • Вопрос задан
  • 3455 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя Станислав Макаров К ответам на вопрос (1)
Nipheris
@Nipheris Куратор тега C++
Ключ к пониманию передачи сигналов - понимание смысла существования QThread:

> A QThread object manages one thread of control within the program. QThreads begin executing in run(). By default, run() starts the event loop by calling exec() and runs a Qt event loop inside the thread.

Запуск собственного цикла обработки сообщений и дает возможность получать их в том числе и из других потоков. Фишка сигналов/слотов кьюта в том, что это еще и простая message queue система, наподобие эрланговской, если сталкивались. Вызов в рамках одного потока - это прямой вызов подписанных слотов на этом же стеке, а вот QueuedConnection или межпоточный вызов кладут в очередь соответствующего потока сообщение (эти сообщения лежат в одной очереди с сообщениями от ОС), и поток будет их извлекать в event-loop-е. Таким образом, вы просто просите другой поток вызвать слот, а вызовет он его когда в очередной раз будет отрабатывать цикл сообщений и он дойдет до сообщения о вызове слота.

> It is safe to connect signals and slots across different threads, thanks to a mechanism called queued connections.
doc.qt.io/qt-5.4/qt.html#ConnectionType-enum
Qt::QueuedConnection - The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
Ответ написан