Qt — испустить сигнал из потока c ++

Я хочу испустить сигнал из потока C ++ (std :: thread) в Qt.

Как мне это сделать?

13

Решение

Вы определенно можете испустить сигнал из потока (QThread, std::thread или даже boost::thread). Только вы должны быть осторожны с пятым параметром вашей функции подключения (Qt::ConnectionType):

Если Qt::DirectConnection: Слот вызывается немедленно (из текущего потока), когда испускается сигнал.
Если Qt::QueuedConnection: Слот вызывается, когда управление возвращается в цикл обработки событий получателя. Слот выполняется в потоке получателя.

Увидеть ConnectionType-перечисление для большего количества вариантов.

Проблема не в том, из какого потока вы посылаете сигнал, а в том, из какого потока вызывается слот. Например, я думаю, QLabel::setText должен быть выполнен из QLabelТема владельца (скорее всего основная). Так что, если вы излучаете сигнал, связанный с QLabel«s setText из потока, соединение должно быть сделано с Qt::AutoConnection, Qt::QueuedConnection или же Qt::BlockingQueuedConnection,

11

Другие решения

Вы, вероятно, не должны излучать сигнал Qt от std::thread-создана нить в общем без заботы. Увидеть Jpo38 ответ : тип соединения имеет значение и т. д …

Если поток выполняет какой-то цикл событий Qt, вы, вероятно, могли бы. Увидеть темы и QObject

Существует (вероятно, для Unix) обходной путь, который делает то же самое, что и для Unix сигналы с Qt : используйте трубу из вашего std::thread в основной поток.

Но, как прокомментировал Иоахим Пилеборг, ты должен сделать свой собственный QThread. Это самый простой и, вероятно, самый короткий (с точки зрения исходного кода), и вам просто нужно скопировать и вставить существующий пример и адаптировать его к вашим потребностям.

Остерегайтесь, что AFAIK только основная нить должен делать манипуляции с Qt GUI. Вы не должны использовать QWidget (и т. Д.) Вне основного потока! (Кстати, GTK имеет такое же ограничение, по крайней мере, в Linux: только основной поток должен использовать X системные протоколы Windows)

4

Если вы держите указатель на свой QObject, вы можете использовать один из QMetaObject::invokeMethod член http://qt-project.org/doc/qt-5/qmetaobject.html#invokeMethod

Вероятно, вам придется использовать Qt::QueuedConnection поэтому ваш сигнал будет вызываться в правильном потоке (не в вашем std :: thread). Помните, что ваш сигнал не будет активирован немедленно.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector