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学习笔记 线程(一)的更多相关文章

  1. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  2. Qt学习笔记-Widget布局管理

    Qt学习笔记4-Widget布局管理       以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,f ...

  3. QT学习笔记(一)——Helloworld

    QT学习笔记(一)--Helloworld 一.调试的基本方法: Log调试法 --在代码中加入一定的打印语句 --打印程序状态和关键变量的值 断点调试法: --在开发环境中的对应代码行加上断点 -- ...

  4. qt学习笔记(七)之数据库简介(所有支持数据库类型的列表)

    笔者最近用Qt写公司的考勤机.本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手. 废话不 ...

  5. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

  6. SYSBIOS学习笔记---线程(Threads)

    在SYS/BIOS中,广义上指被处理器执行的任何独立的指令流.线程是一个能够调用一个函数或者中断服务程序的单点控制.在sysbios系统中一共有硬件中断(HWI).软件中断(SWI).任务(Task) ...

  7. Qt学习笔记(2)-利用StackWidget实现选项卡式页面

    学习笔记第二篇,利用Qt实现选项卡式的页面,效果如图1.1-图1.3所示.程序实现的功能是通过点击状态栏实现不同页面的切换,实际上Qt中自带有Tab选项卡式的控件,本文利用StackWidge实现类似 ...

  8. Qt学习笔记(1) hello world

    Qt的简介: Qt是一个跨平台的C++ GUI库实现,原本只是以为它只提供一些图形接口,看来我还是低估了它,采用文档Qt学习之路2开始学习,不知道这个文档是不是有点老了,管他呢,先了解下. 搭建环境: ...

  9. 【Qt学习笔记】Qt+VS2010的配置

    http://blog.csdn.net/jocyln9026/article/details/8575218 关于Qt Qt是1991年由Trolltech公司开发的一个跨平台的C++图形用户界面应 ...

随机推荐

  1. MySql 中 case when then else end 的用法

    解释: SELECT                case                   -------------如果    when sex='1' then '男' ---------- ...

  2. mysql常用函数汇总

    一.数学函数ABS(x)   返回x的绝对值BIN(x)   返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x)   返回大于x的最小整数值EXP(x)   返回值e(自然对数 ...

  3. android Activity生命周期(设备旋转、数据恢复等)与启动模式

    1.Activity生命周期     接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...

  4. 记录Sqlserver2012附加Sqlserver2008的数据库出错的解决方案

    一.摘要 最近在实验里面用台式编写好了一个软件,想移植到家里的笔记本上.在附加数据的时候却出现了错误,具体也没有提示什么错误,反正就是附加失败了. 二.解决方案 在网上看了一些资料,有的说[低版本不能 ...

  5. PHP用mb_string函数库处理与windows相关中文字符

    昨天想批处理以前下载的一堆文件,把文件里的关键内容用正则匹配出来,集中处理.在操作文件时遇到一个问题,就是windows操作系统中的编码问题. 我们都知道windows中(当然是中文版),文件名和文件 ...

  6. 《C陷阱与缺陷》之1词法"陷阱"

    编译器中负责将程序分解为一个一个符号的部分,一般称为"词法分析器".在C语言中,符号之间的空白(包括空格符.制表符或换行符)将被忽略. 1.=不同于== C语言使用符号" ...

  7. 根据网站所做的SEO优化整理的一份文档

    今日给合作公司讲解本公司网站SEO优化整理的一份简单文档 架构 ########################################## 1.尽量避免Javascript和flash导航. ...

  8. Mysql中使用find_in_set函数查找字符串

    mysql有个表的字段的存储是以逗号分隔的,如domain字段login.s01.yy.com,s01.yy.com,s02.yy.com.现在要查找s01.yy.com这个.我们用like查找好像不 ...

  9. JQuery中的extend函数

    1.jQuery.fn.extend(object) 扩展 jQuery 元素集来提供新的方法(通常用来制作插件). 例如:增加两个插件方法. jQuery.fn.extend({ check: fu ...

  10. canvas作为背景

    比如canvas的id是HB, 画好后执行document.body.style.background = "url('"+HB.toDataURL()+"')" ...