您的位置:首页 > 编程语言 > Qt开发

Qt线程的使用(一)

2020-06-30 16:11 169 查看

Qt线程的使用(一)

1.线程启用

QThread 即Qt中的线程类,与进程中的其他线程共享数据,但独立运行。QThread 从run()函数开始执行,通过调用start()函数开启run(),通过调用exec()开启时间循环。
先穿件一个MyTread类文件,这个类继承了QThread

//MyTread.h文件
#include <QThread>
#include <QDebug>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
void stop();
private:
volatile bool stopped;		//判断线程是否关闭的标志位
protected:
void run();
signals:
public slots:
};
//MyTread.c文件
MyThread::MyThread(QObject *parent) :
QThread(parent)
{
stopped = false;	//将线程停止标志位设置为false
}

//启动线程函数
void MyThread::run()
{
qreal i =0;		//对double的类型定义在所有平台上,除了那些使用ARM架构的cpu的平台。在基于arm的平台上,由于性能原因,qreal是float的类型定义。
while(! stopped)
{
qDebug()<<QString("in thread %1").arg(i++);
}
stopped = false;
}

//关闭线程函数
void MyThread::stop()
{
stopped = true;
}
//主界面widget.c函数中
//给两个按钮装上运行线程和结束线程的槽函数
connect(begin_btn,SIGNAL(clicked()),this,SLOT(getfilebase()));
connect(stop_btn,SIGNAL(clicked()),this,SLOT(readfile()));

//运行线程按钮槽函数
bool Widget::begin()
{
thread.start();
begin_btn->setEnabled(false);
stop_btn->setEnabled(true);
}
//结束线程槽函数
bool Widget::stop()
{
//调用自定义的结束线程函数,没有调用危险terminate
if(thread.isRunning())
{
thread.stop();
begin_btn->setEnabled(true);
stop_btn->setEnabled(false);
}
}

2.线程同步-生产/消费者模式

Qt中的QMutex,QReadWriteLock,QSemaphore,QWaitCondition,这些类都提供了同步线程的方法。使用线程的思想是多个线程尽可能的并发执行,但是有时一些线程就要停下来等待其他线程完成任务才行。例如同时访问相同的全局变量,并对其进行操作,那么就会存在一个先后问题,以及变量数值的时效性。

1.QMutex提供了一个互斥锁,在任何时间一个线程至多只能获取一个互斥锁。如果一个线程访问互斥锁,但是互斥锁此时被使用了,则该线程会阻塞在哪,等待互斥锁被释放。因此互斥锁经常用于共享数据的保护。
2.QReadWriteLock读写锁,与互斥锁类似,只不过分为读和写,
3.QSemaphore信号量,保护一定数量的相同的的资源
4.QWaitCondition条件变量,允许一个线程在满足一定条件下,唤醒一个或多个其他线程。一个或多个线程也可阻塞在一个条件变量下。当条件变量满足,唤醒多个线程时,一般是随机分配,按谁先阻塞谁先进条件变量。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: