[英]Behaviour of a c++ model update from a different thread from which the QML QtQuick2 engine is running
該方案具有以下組件:
這些組件之間的關系:
問題:在哪個線程中發生“emit data_changed(...)”的回調?
注意
這個問題的一個關鍵因素是啟動的線程不是qt意識。
我假設工作線程在某些QObject
上調用信號方法。 這是完全線程安全的,也是一件有效的事情。 信號的實現將當前線程與每個槽的線程進行比較,並確定要使用的連接類型(如果連接是自動類型)。
只要使用自動或排隊連接連接到所述信號,就會在其QObject
實例的thread()
中調用這些插槽。
調用信號的線程並不重要,並且該線程是否是Qt線程無關緊要。
如果你為一個仿函數的連接提供了一個上下文對象,那么仿函數將在上下文對象的線程中執行,這樣你就可以對對象進行線程安全的仿函數調用:)
例如:
#include <QtCore>
#include <thread>
class Object : public QObject {
Q_OBJECT
public:
Q_SIGNAL void ping();
Q_SLOT void pong() {
qDebug() << "hello on thread" << QThread::currentThread();
qApp.quit();
});
};
int main(int argc, char ** argv) {
QCoreApplication app(argc, argv);
Object obj;
qDebug() << "main thread is" << QThread::currentThread();
QObject::connect(&obj, &Object::ping, &obj, &Object:pong);
QObject::connect(&obj, &Object::ping, []{
qDebug() << "context-free functor invoked on thread" << QThread::currentThread();
});
QObject::connect(&obj, &QObject::ping, &obj, []{
qDebug() << "context-ful functor invoked on thread" << QThread::currentThread();
});
auto thread = std::thread([&obj]{
emit obj.ping();
});
int rc = app.exec();
thread.join();
return rc;
}
#include "main.moc"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.