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