生活在一个线程中的QObject可以从另一个线程发出信号吗?

时间:2019-06-05 14:30:28

标签: c++ multithreading qt thread-safety qthread

我在主线程中创建了一个对象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将事件发布到主线程事件队列中。我没有使用任何同步原语,所以我可能会遇到问题。

我可以像在代码示例中一样使用信号/插槽机制吗?我在做错什么吗?

0 个答案:

没有答案
相关问题