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条件变量,允许一个线程在满足一定条件下,唤醒一个或多个其他线程。一个或多个线程也可阻塞在一个条件变量下。当条件变量满足,唤醒多个线程时,一般是随机分配,按谁先阻塞谁先进条件变量。
相关文章推荐
- Qt线程的简单使用--QReadWriteLock的用法
- Qt线程的简单使用
- Qt线程使用杂谈
- Qt线程的简单使用(三)——通过一个实例理解QMutex的使用
- 制作使用天空盒(Skyboxes)
- Spring定时任务使用和如何使用邮件监控服务器
- 使用Arrays.asList()需要注意的点
- numpy中hstack和reshape的使用示例
- C#使用异步实现 IO 操作
- dubbo使用经验及实现原理简单介绍(转载)
- Spring中使用@Value读取porperties文件中的属性值方法总结及注意事项
- java 的 sqlHelper,改改之后也适用于不使用 EF 的 C# 项目,包含查询和建表。
- 使用promise实现异步
- 欢迎使用CSDN-markdown编辑器
- 使用h5py导入自己的图片训练集与测试集
- strstr函数的使用
- 微信域名检测API接口猴子数据使用教程
- Spring使用外部属性文件
- java 强制使用utf-8
- django入门与学习-模板的基本使用-4