我在主线程中创建了一个对象a
,该信号的信号连接到也位于主线程中的其他对象b
的插槽中。
然后,我创建一个对象c
并将其移动到worker
线程,在该线程中它将定期通过指针周期性地访问对象a
,更改其状态并发出信号
这是代码:
(注意:某些行被有意忽略以使示例简短)
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();
}
我希望从线程a
发出的 worker
信号将触发主线程中的 b
插槽。我希望我不会出现并发问题,因为a
成员的大小为8位。
但是生活在线程c
中的worker
将事件发布到主线程事件队列中。我没有使用任何同步原语,所以我可能会遇到问题。
我可以像在代码示例中一样使用信号/插槽机制吗?我在做错什么吗?