基于Qt的线程安全退出

最近,在线程退出时,老是会遇到程序异常问题。为此,对于QThread的线程退出,做了详细的测试,并将测试结果做个总结。

首先,QThread的用法有两种:

(1)继承自QThread类:

#ifndef CHILDTHREADA_H
#define CHILDTHREADA_H
 
#include <QThread>
#include <QMutex>
 
class ChildThreadA : public QThread
{
    Q_OBJECT
 
public:
    explicit ChildThreadA(QWidget *parent = 0);
    ~ChildThreadA();
 
    void exitThread();
protected:
    void run();
private:
    bool m_isExist;//控制线程退出
    QMutex m_mutex;
};
 
#endif // CHILDTHREADA_H

#include "ChildThreadA.h"
ChildThreadA::ChildThreadA(QWidget *parent) :
    QThread(parent),
    m_isExist(false)
{
 
}
 
ChildThreadA::~ChildThreadA()
{
    delete ui;
}
 
void ChildThreadA::exitThread()
{
    m_mutex.lock();
    m_isExist = true;
    m_mutex.unlock();
}
 
void ChildThreadA::run()
{
    while (1)
    {
        m_mutex.lock();
        if(m_isExist)
        {
            break;
        }
        m_mutex.unlock();
        //do something
    }
    m_mutex.unlock();
}
 

在自定义的线程类中通过使用m_isExist变量控制线程的退出。在外部调用退出线程时应该这样:

       childThread->exitThread();       if (childThread->wait())        {            //m_capPicThread->terminate();

        }

首先调用退出线程接口,重置标识符的值;程序会阻塞再wait()处直到while循环退出,关于terminate()这行代码要不要都可以,因为可以执行到此,whllie循环肯定已经退出。

(2)自定义QObject类型,moveToThread():

#ifndef MYOBJECT_H
#define MYOBJECT_H
 
#include <QObject>
 
class MyObject : public QObject
{
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = 0);
 
signals:
 
public slots:
};
 
#endif // MYOBJECT_H

#include "MyObject.h"
 
MyObject::MyObject(QObject *parent) : QObject(parent)
{
    
}
 

MyObject *object = new MyObject;

QThread *thread = new QThread;

object->moveToThread(thread);

这种做法在线程退出时,因为子线程的运行是在槽函数中进行的,所以首先应该断开槽函数的连接

disconnect();然后使用

        thread ->quit();

        thread ->wait();使线程正常退出。


  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值