该设想包括以下几个组成部分:
这些组成部分之间的关系:
问题:“data_changed(.)”的回调在哪个线程中进行发生了什么?
Note
这个问题的一个关键因素是已启动的线程不知道qt。
发布于 2015-07-28 12:37:57
我假设工作线程在某些QObject上调用一个信号方法。这是完全线程安全的,也是一件有效的事情。信号的实现将当前线程与每个插槽的线程进行比较,并确定使用何种连接(如果连接是自动类型的)。
只要使用自动连接或排队连接连接到所述信号,插槽就会在其QObject实例的QObject中被调用。
在哪个线程中调用信号并不重要,该线程是否是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"https://stackoverflow.com/questions/31670368
复制相似问题