@pixik

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

Всем привет!
Сам по себе принцып работы сигнал-слот в qt мне понятен (когда один объект передаёт сигнал в слот дургого объекта в одном потоке). Совсем запутался, когда попытался разобраться, как же мне из объекта, находящегося в одном потоке, передать сигнал в слот объекту, находящегося в другом потоке.
Кто разбирается, объясните пожалуйста. Внятной информации нагуглить не получилось, кроме той, которая окончательно меня запутала.
Спасибо!
  • Вопрос задан
  • 2866 просмотров
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы