Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 生活在一个线程中的QObject能否从另一个线程发出信号?_C++_Multithreading_Qt_Thread Safety_Qthread - Fatal编程技术网

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();
}