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++图形用户界面应 ...
随机推荐
- EasyUi 改变 selelct 的 下拉内容 div 的高度
直接上 效果图: 修改之后的 滚动条高度: 代码: 源代码下载
- Unbuntu_14.04编译openjdk7
今天有问题需要研究一下JVM,但系统挂了,只能重装.在ubuntu下再次编译JDK,大约2个半小时,将遇到的问题笔记整理一下. 1.下载Openjdk Source Code 我用的是http://d ...
- Let's Encrypt 正式出發(免费HTTPS证书即将到来)
转自:https://blog.gslin.org/archives/2015/10/20/6073/lets-encrypt-%E6%AD%A3%E5%BC%8F%E5%87%BA%E7%99%BC ...
- [转]Shell中read的常用方式
原文:Linux Shell Scripting Tutorial V2.0 read命令的语法: read -p "Prompt" variable1 variable2 var ...
- 关于《Windows程序设计(第五版)》中一个实例程序的疑问
最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实 ...
- x01.os.10: 输入输出
从 x01.Lab.Download 中下载源代码,进入工程目录,make 后再 bochs,即可见到如下界面: 随便打几个字,ok!按 F2,可切换到第二个终端,界面如下: 当然,按 F3 还可切换 ...
- python脚本实现自动保留ctime最近的几个文件
使用了给字典排序的sorted方法 #!/usr/bin/env python # coding:utf-8 import os def rm_backup(rm_path,days): files_ ...
- js中的继承
js中继承的实现方式很多,此处给出两种常用方式. <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> ...
- C#基础---委托的使用
一:什么是委托 委托是一种定义方法签名的类型当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法.委托是一个引用类型,所以它具有引用类型所具有的通性.它保存 ...
- 移动前端UI选择
移动前端UI选择 目录 三.SUI Mobile 一.jQuery Mobile jQuery Mobile 是jQuery在移动设备上的版本,做为主要针对移动设备的框架来说,它提供一个移动设备平 ...