多线程问题

点击查看代码
class SafetyWork:public QObject
{
    Q_OBJECT
public:
    explicit SafetyWork(MotionCardInterface*card,QObject *parent = nullptr);
public slots:
    void startMotion(int intervalMs=100);//开始检查
    void stopMotion();//停止检查
    void Checking();//具体的检查
signals:
    void SafetyError(int code,const QString&errorMessage);//安全检查出现问题
    void safetyStatusChanged(bool isSafe);//安全状态改变
private:
    MotionCardInterface*m_card=nullptr;//控制卡
    bool m_running=false;//是否在运行
};
class SafetyMonitor : public QObject
{
    Q_OBJECT
public:
    explicit SafetyMonitor(MotionCardInterface*card,QObject *parent = nullptr);
    ~SafetyMonitor();
    void start(int intervalMs=100);//开始监控检查
    void stop();//结束监控检查
signals:
    void SafetyError(int code,const QString&errorMessage);//安全检查出现问题
    void safetyStatusChanged(bool isSafe);//安全状态改变
private:
    QThread*m_thread;
    SafetyWork*m_safetyWork;
};
如果在SafetyMonitor中
点击查看代码
this->m_safetyWork=new SafetyWork(card,this);
this->m_safetyWork->moveToThread(this->m_thread);
会出现一个问题:就是SafetyWork的父类是SafetyMonitor,但是SafetyWork又转移进了多线程中,但是这个父类SafetyMonitor是在主线程中的,这样就会导致生命周期混乱 所以如果我们要把一个类转移进多线程中的话最好不要让其继承父类

还有个场景比如:

点击查看代码
void SafetyMonitor::stop()
{
    if(this->m_thread->isRunning())
    {
        this->m_safetyWork->stopMotion();
        this->m_thread->quit();
        this->m_thread->wait();
    }
}
上面已经说了把m_safetyWork放入到子线程中了,但是这个stop()中在主线程中又执行了m_safetyWork的stopMotion(),这是不可以的,正确来说应该是在子线程中进行这个函数的调用
点击查看代码
void SafetyMonitor::stop()
{
    if(this->m_thread->isRunning())
    {
        // 通过 invokeMethod 在子线程中调用
        QMetaObject::invokeMethod(this->m_safetyWork, "stopMotion", Qt::QueuedConnection);
        this->m_thread->quit();
        this->m_thread->wait();
    }
}

posted on 2026-07-25 15:48  dd_l  阅读(4)  评论(0)    收藏  举报