Qt学习笔记 线程(一)
Qt中的线程是与平台无关的
QThread 提供了创建一个新线程的方法
新建一个线程,继承QThread并重写它的run()当调用 start()函数时会调用重载的run()函数
例:
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread> class MyThread : public QThread
{
Q_OBJECT
public:
bool stop ;
explicit MyThread(QObject *parent = );
void run();
signals: public slots: };
#endif // MYTHREAD_H
#include "mythread.h"
#include<QDebug>
MyThread::MyThread(QObject *parent) :
QThread(parent)
{
stop = false;
}
void MyThread::run()
{
for(int i=;i<;i++)
{
if(stop)break;
qDebug()<<i;
QThread::sleep();
}
}
#include <QCoreApplication>
#include "myobject.h"
#include <QThread>
#include<QDebug>
#include "mythread.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyThread myThread;
myThread.start();
QThread::sleep();
myThread.stop=true;
return a.exec();
}
看一下Qt中包含的线程类:
QThread 所有线程的基类,提供了创建一个线程的方法
QThreadStorge 提供一逐线程数据存储
QMutex 提供相互排斥的锁,或互斥量
QMutexLocker 可以自动对QMutex加锁与解锁
QReadWirterLock 提供了一个可以同时读操作的锁
QreadLocker与QwriteLocker可以自动对QReadWriteLock加锁与解锁
QSempHore提供了一个整形信号量,是互斥的泛化
QWaitCondition提供了一种方法,使线程可以在被另外线程唤醒之前一直休眠
线程的同步
QMutex 提供相互排斥的锁,或互斥量
QMetex提供了lock和Unlock函数,如果 一个已经锁定 这个互斥量,只有这个线程unlock后其它线程才可以
访问
把上边的例子做一下修改,只是为了方便大家理解,这个例子没什么作用
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread> class QMutex;
class MyThread : public QThread
{
Q_OBJECT
private:
QMutex qm;
bool stop;
public:
explicit MyThread(QObject *parent = );
void run();
void SetFlg(bool flg);
signals:
public slots: };
#endif // MYTHREAD_H
#include "mythread.h"
#include<QDebug>
#include<QMutex>
MyThread::MyThread(QObject *parent) :
QThread(parent)
{
stop = false;
}
void MyThread::SetFlg(bool flg)
{
qm.lock();
stop=flg;
qm.unlock();
} void MyThread::run()
{
for(int i=;i<;i++)
{
qm.lock();
if(stop)
{
qm.unlock();
break;
}
qDebug()<<i;
QThread::sleep();
qm.unlock();
}
}
#include <QCoreApplication>
#include "myobject.h"
#include <QThread>
#include<QDebug>
#include "mythread.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyThread myThread;
myThread.start();
QThread::sleep();
myThread.SetFlg(true);
return a.exec();
}
使用QMutex时要小心因为如果 lock()后没有unlock()会导致死锁别的线程就
永远也不能访问资源了
Qt提供了QMutexLocker来解决这个问题
修改我们的app文件
#include "mythread.h"
#include<QDebug>
#include<QMutex>
#include<QMutexLocker>
MyThread::MyThread(QObject *parent) :
QThread(parent)
{
stop = false;
}
void MyThread::SetFlg(bool flg)
{
QMutexLocker locker(&qm);
stop=flg;
} void MyThread::run()
{
QMutexLocker locker(&qm);
for(int i=;i<;i++)
{
if(stop)
{
break;
}
qDebug()<<i;
QThread::sleep(); }
}
QMutexLocker会自己unluck
QMutexLocker也提供了一个mutex()成员函数返回QMutexLocker操作的互斥量。对于需要访问互斥量是十分有用的,比如QWaitCondition::wait()。
QReadWirterLock
用mutext进行线程同步有一个问题某个时刻只许一个线程访问资源如果同时有多个线程对共享资源进行访问,
同时有写操作线程那么这种情况下采用mutex就会成为程序的瓶颈。使用QReadWriteLock来实现多线程
读操作,一个线程写操作,写线程执行时会阻塞所有的读线程,而读线程运行不需要进行同步
QReadWriteLock lock; void ReaderThread::run()
{
...
lock.lockForRead();
read_file();
lock.unlock();
...
} void WriterThread::run()
{
...
lock.lockForWrite();
write_file();
lock.unlock();
...
}
QreadLocker和QWriteLocker类是对QReadWirterLock 的简化
它们会自动unluck();
QReadWriteLock lock; QByteArray readData()
{
QReadLocker locker(&lock);
...
return data;
}
相当于QReadWirterLock 的写法如下
QReadWriteLock lock; QByteArray readData()
{
lock.lockForRead();
...
lock.unlock();
return data;
}
Qt学习笔记 线程(一)的更多相关文章
- qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...
- Qt学习笔记-Widget布局管理
Qt学习笔记4-Widget布局管理 以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,f ...
- QT学习笔记(一)——Helloworld
QT学习笔记(一)--Helloworld 一.调试的基本方法: Log调试法 --在代码中加入一定的打印语句 --打印程序状态和关键变量的值 断点调试法: --在开发环境中的对应代码行加上断点 -- ...
- qt学习笔记(七)之数据库简介(所有支持数据库类型的列表)
笔者最近用Qt写公司的考勤机.本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手. 废话不 ...
- JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?
前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...
- SYSBIOS学习笔记---线程(Threads)
在SYS/BIOS中,广义上指被处理器执行的任何独立的指令流.线程是一个能够调用一个函数或者中断服务程序的单点控制.在sysbios系统中一共有硬件中断(HWI).软件中断(SWI).任务(Task) ...
- Qt学习笔记(2)-利用StackWidget实现选项卡式页面
学习笔记第二篇,利用Qt实现选项卡式的页面,效果如图1.1-图1.3所示.程序实现的功能是通过点击状态栏实现不同页面的切换,实际上Qt中自带有Tab选项卡式的控件,本文利用StackWidge实现类似 ...
- Qt学习笔记(1) hello world
Qt的简介: Qt是一个跨平台的C++ GUI库实现,原本只是以为它只提供一些图形接口,看来我还是低估了它,采用文档Qt学习之路2开始学习,不知道这个文档是不是有点老了,管他呢,先了解下. 搭建环境: ...
- 【Qt学习笔记】Qt+VS2010的配置
http://blog.csdn.net/jocyln9026/article/details/8575218 关于Qt Qt是1991年由Trolltech公司开发的一个跨平台的C++图形用户界面应 ...
随机推荐
- MySQL 调优基础(一) CPU与进程
一般而言,MySQL 的调优可以分为两个层面,一个是在MySQL层面上进行的调优,比如SQL改写,索引的添加,MySQL各种参数的配置:另一个层面是从操作系统的层面和硬件的层面来进行调优.操作系统的层 ...
- Linux软件的卸载
configure作用:是源码安装软件时配置环境用的 他根据你的配置选项和你的系统情况生成makefile文件 为make 做准备 最常用的参数: ./configure --prefix 作用: 不 ...
- Java【小考】
课上, 老师出了一个题: 考察:1.类的定义 2.类的属性 3.类的方法.重载.构造方法.代码块 题目是这样的: 设计 一个 类:Tree 要求: 1.包含main方法 2.属性:静态: String ...
- 通过三张图了解Redux中的重要概念
上周利用业余的时间看了看Redux,刚开始有点不适应,一下在有了Action.Reducer.Store和Middleware这么多新的概念. 经过一些了解之后,发现Redux的单向数据里的模式还是比 ...
- 学习OpenStack之 (3):Devstack Screen 使用技巧
Devstack环境中,openstack运行在一个screen中,每个service运行在一个window中.我总结的几个tips: 0. 注意需要使用screen启动用户来进行一下操作 1. 查看 ...
- 学习OpenStack之 (4): Linux 磁盘、分区、挂载、逻辑卷管理 (Logical Volume Manager)
0. 背景: inux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间.普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻 ...
- 挤点时间写博客-php&MySQL实践
hi 晚上要吃火锅的嘛,挤点时间写点东西吧,别被老板发现哦 1.PHP与MySQL 五.文章发布系统之后台 5.2 创建配置文件和初始化文件 为了统一配置以及管理方便,还有就是减少代码的冗余. 分别为 ...
- shiro和quartz同时存在于项目中,解决冲突的方案
shiro自带了quartz定时任务,不过版本是1.3的 很多项目都会使用shiro,另外定时任务也会使用,quartz的版本2.2目前和shiro不兼容 有人通过修改源码可以解决 我这边是这样解决的 ...
- PHP加载另一个文件类的方法
加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php class a { public $name = ' ...
- JavaScript语言精粹笔记
JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取 ...