Я новичок в Qt
. У меня есть рабочий поток, который является std::thread
. Функция рабочего потока непрерывно извлекает некоторые данные в цикле. Размер данных часто обновляется на элементе Text
на интерфейсе QML
. У меня есть обратный вызов слушателя, который является ничем иным, как std::function
, и он вызывается из thread's function
. Он отправляет мне обратные вызовы, на основании которых я обновил элемент Text
на QML
. Я обновляю его с помощью механизма signal slot
.Извлечение сигнала Qt :: из рабочего потока делает обновление пользовательского интерфейса по основному потоку по умолчанию?
Ниже приводится QML : Text
элемент:
Text {
id: mytext
objectName: "mytextobject"
function slotUpdateData(someValue){
mytext = someValue
}
}
SignalUpdateData
связан с slotUpdateData
который находится на стороне QML
. Каждый раз, когда я получаю обратный вызов события данных из std::thread
, I emit SignalUpdateData
, который обновляет QML Text element
по адресу UI
.
void CallBackReceivedFromWorkerThread(float someValue) {
emit SignalUpdateData(someValue)
}
После как я подключил этот C++ signal
с QML slot
QObject::connect(this, SIGNAL(SignalUpdateData(QVariant)), myTextItemQObject, SLOT(slotUpdateData(QVariant)));
И все это прекрасно работает. Никаких сбоев, блокировок, ничего.
В соответствии с моим пониманием, поскольку функция рабочего потока вызывает обратный вызов, элемент управления выполнением находится в рабочем потоке при получении обратного вызова. Поэтому, когда мы делаем emit SignalUpdateData(someValue)
, мы все еще находимся на рабочем потоке. И насколько я знаю из своего предыдущего опыта в android
& java
, мы не можем обновлять пользовательский интерфейс из любого места вне приложения main thread
.
Итак, Как это работает? Есть emit SignalUpdateData(someValue)
, ставящий вызов в main UI thread's event loop
? Is Qt
все еще делает изменение пользовательского интерфейса на main thread
, несмотря на то, что я вызываю его из worker thread
? Если мой подход в порядке, то это имеет последствия для производительности? Какая рекомендация для этого?
Я хочу быть очень уверенным в этом & не просто повезло, что заставило это работать. Должен ли я использовать Qt::Connection_enum, а также для наилучшего подхода?
Насколько я знаю (может быть, не так), все QML происходит в потоке main/gui. –