您现在的位置:首页 > >

基于Qt的线程安全退出

发布时间:

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


首先,QThread的用法有两种:


(1)继承自QThread类:


#ifndef CHILDTHREADA_H

#define CHILDTHREADA_H


#include

#include


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


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();使线程正常退出。





热文推荐
猜你喜欢
友情链接: 大学学习资料 人文社科 经营营销资料 工程资料大全 IT文档 自然科学