Может ли QObject, находящийся в одном потоке, излучать сигнал из другого потока? - PullRequest
2 голосов
/ 05 июня 2019

У меня есть объект 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, будет публиковать события в очереди событий основного потока. Я не использую какой-либо примитив синхронизации, поэтому боюсь, что у меня могут возникнуть проблемы.

Могу ли я использовать механизм сигнала / слота так же, как в примере кода? Я что-то не так делаю?

...