C++ 生活在一个线程中的QObject能否从另一个线程发出信号?
我在主线程中创建了一个对象C++ 生活在一个线程中的QObject能否从另一个线程发出信号?,c++,multithreading,qt,thread-safety,qthread,C++,Multithreading,Qt,Thread Safety,Qthread,我在主线程中创建了一个对象a,其信号连接到另一个对象b的插槽,该对象也位于主线程中 然后我创建一个对象c,并将其移动到worker线程,在那里它将定期通过指针访问对象a,更改其状态并发出信号 代码如下: (注意:故意忽略了一些行,以保持示例简短。) 我希望线程worker发出的a信号将触发主线程中的b插槽。我希望不会出现并发问题,因为a成员大小为8位 但是位于线程工作线程中的c,将在主线程事件队列中发布事件。我没有使用任何同步原语,因此我担心可能会遇到问题 我在代码示例中使用信号/插槽机制的方式
a
,其信号连接到另一个对象b
的插槽,该对象也位于主线程中
然后我创建一个对象c
,并将其移动到worker
线程,在那里它将定期通过指针访问对象a
,更改其状态并发出信号
代码如下:
(注意:故意忽略了一些行,以保持示例简短。)
我希望线程worker
发出的a
信号将触发主线程中的b
插槽。我希望不会出现并发问题,因为a
成员大小为8位
但是位于线程工作线程中的c
,将在主线程事件队列中发布事件。我没有使用任何同步原语,因此我担心可能会遇到问题
我在代码示例中使用信号/插槽机制的方式可以吗?有什么我需要担心的吗?只要您的信号连接是QueuedConnection,Qt的信号/插槽机制将确保从插槽对象的线程中调用插槽:
class A : public QObject
{
Q_OBJECT
friend class C;
signals:
void sigA();
private:
quint8 _m1;
quint8 _m2;
};
class B : public QObject
{
Q_OBJECT
public slots:
void slotB();
};
class C : public QObject
{
Q_OBJECT
public:
C(A* a) : _a{a}, _timer{new QTimer{this}}
{
_timer->setInterval(5);
connect(_timer, &QTimer::timeout, this, &C::doSomeWork);
}
public slots:
void start() { _timer->start(); }
private slots:
void doSomeWork()
{
// update members of `a`
emit _a->sigA();
// ...
}
private:
A* _a;
QTimer* _timer;
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
A* a {new A};
B* b {new B};
QObject::connect(a, &A::sigA, b, &B::slotB);
QThread* worker {new QThread};
C* c {new C{a}};
c->moveToThread(worker);
QObject::connect(worker, &QThread::started, c, &C::start);
worker->start();
return app.exec();
}