多线程问题
点击查看代码
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;
};
点击查看代码
this->m_safetyWork=new SafetyWork(card,this);
this->m_safetyWork->moveToThread(this->m_thread);
还有个场景比如:
点击查看代码
void SafetyMonitor::stop()
{
if(this->m_thread->isRunning())
{
this->m_safetyWork->stopMotion();
this->m_thread->quit();
this->m_thread->wait();
}
}
点击查看代码
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();
}
}
浙公网安备 33010602011771号