一、想要使用Qthread必须先创建,继承Qthread的类。

 #ifndef THREADTEST_H
#define THREADTEST_H #include <QThread>
#include <QMutex> class ThreadTest : public QThread
{
public:
ThreadTest();
~ThreadTest(); void setMessage(const QString &message);
void stop(); protected:
void run() Q_DECL_OVERRIDE; private:
QString messageStr;
volatile bool stopped;
QMutex mutex;
bool quit; }; #endif // THREADTEST_H

Qthread继承

创建的类中有void run()函数和void stop()。

当调用start()函数时,会接着调用run函数。

二、Mutex互斥锁

可以用mutex.lock()上锁,mutex.unlock()解锁。用以保护资源。

然后可以用简化的方式使用QmutexLocker lock(&mutex),函数中部分结束后自动释放。

还有QReadWriteLock来替换mutex。lock.lockForRead(),lock.lockForWrite()

三、信号量

QSemaphore semaphore(1);

semaphore.acquire();

semaphore.release();

信号量和互斥量的区别在于信号量可以设置初值。

四、在生产和消费中的应用。

freeSpace.acquire();

freeSpace.realease();

usedSpace.acquire();

usedSpcae.release();

五、QWaitCondition

QWaitCondition允许一个线程在满足一定的条件下触发其他多个线程。可以和QMutex一起使用达到精确控制。

不同的消息就要用到不同的QWaitCondition,传入的参数必须是锁定的mutex。

#include <iostream>
#include <QtCore> using namespace std; const int DataSize = ;
const int BufferSize = ;
int buffer[BufferSize];
int usedSpace = ; QMutex mutex;
QWaitCondition bufferIsNotEmpty;
QWaitCondition bufferIsNotFull; class Producer : public QThread
{
void run();
}; void Producer::run()
{
for(int i =;i<DataSize;i++)
{
mutex.lock();
if(usedSpace == BufferSize)
bufferIsNotFull.wait(&mutex);
buffer[i%BufferSize] = i;
std::cerr<<"P";
usedSpace++;
bufferIsNotEmpty.wakeAll();
mutex.unlock();
}
} class Consumer : public QThread
{
void run();
}; void Consumer::run()
{
for(int i =;i<DataSize;i++)
{
mutex.lock();
if(usedSpace == )
bufferIsNotEmpty.wait(&mutex);
usedSpace--;
std::cerr<<buffer[i%BufferSize]<<" ";
bufferIsNotFull.wakeAll();
mutex.unlock();
}
} int main()
{
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return ;
}

QWaitCondition

用QSemaphore也可以实现

const int DataSize = ;
const int BufferSize = ;
char buffer[BufferSize];
QSemaphore freeBytes(BufferSize);
QSemaphore usedBytes;
class Producer : public QThread
{
public:
void run();
};
void Producer::run()
{
qsrand(QTime(,,).secsTo(QTime::currentTime()));
for (int i = ; i < DataSize; ++i) {
freeBytes.acquire();
buffer[i % BufferSize] = "ACGT"[(int)qrand() % ];
usedBytes.release();
}
}
class Consumer : public QThread
{
public:
void run();
};
void Consumer::run()
{
for (int i = ; i < DataSize; ++i) {
usedBytes.acquire();
fprintf(stderr, "%c", buffer[i % BufferSize]);
freeBytes.release();
}
fprintf(stderr, "\n");
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return ;
}

Qsemaphore

六、而Main和次线程通信

要是实现这个功能可以用信号和槽机制

在主界面中运行创建一个Thread *mythread指针,然后mythread->start();不会出错。

QT多线程学习的更多相关文章

  1. [转] Qt 多线程学习

    Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...

  2. Qt 多线程学习

    最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ GUI Qt4 编程>来学习. 这本书的第14章是关于多线程的知识,使用的Qt版本是Qt4.x.在下用的是最新 ...

  3. Qt多线程学习:创建多线程

    [为什么要用多线程?] 传统的图形用户界面应用程序都仅仅有一个运行线程,而且一次仅仅运行一个操作.假设用户从用户界面中调用一个比較耗时的操作,当该操作正在运行时,用户界面一般会冻结而不再响应.这个问题 ...

  4. Qt多线程学习-用例子来理解多线程(转),这个是我看过最好的文章,总结很详细(感觉exec()的作用就是保持线程不退出,这样方便随时处理主线程发来的信号,是一种非常别致的思路)good

    01 class MThread :public QThread 02 { 03 public: 04     MThread(); 05     ~MThread(); 06     virtual ...

  5. Qt多线程学习-用例子来理解多线程

    文章出处:DIY部落(http://www.diybl.com/course/3_program/c/c_js/20090303/157373_3.html) POINT 1:QThread类的实例与 ...

  6. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  7. QT入门学习笔记2:QT例程

    转至:http://blog.51cto.com/9291927/2138876 Qt开发学习教程 一.Qt开发基础学习教程 本部分博客主要根据狄泰学院唐老师的<QT实验分析教程>创作,同 ...

  8. 【QT】 Qt多线程的“那些事”

    目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...

  9. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

随机推荐

  1. Angular JS - 1 - 环境准备

    1.webstorm 下载安装 webstorm 同 intellij IDEA  一样智能好用~ 智能的同时,比较费内存 2. chrome插件安装 按照下图,打开扩展程序,选择开发者模式: 下载n ...

  2. LDD3 第10章 中断处理

    各种硬件和处理器打交道的周期不同,并且总是比处理器慢.必须有一种可以让设备在产生某个事件时通知处理器----中断. 中断仅仅是一个信号,如果硬件需要,就可以发送这个信号.Linux处理中断方式和用户空 ...

  3. HDU - 6621 K-th Closest Distance 主席树+二分答案

    K-th Closest Distance 主席树第二波~ 题意 给你\(n\)个数\(m\)个询问,问\(i\in [l,r]\)计算每一个\(|a_{i}-p|\)求出第\(k\)小 题目要求强制 ...

  4. 树结构遍历节点名字提取,这里提取的是el-tree数据结构,封装成函数

    /** * 树形数据提取节点 * @param {*} data */ export function treeDataGetnode (data) { var res = [] var child= ...

  5. PPT技巧

    1.秋叶个人的PPT三分钟教程   http://www.pptfans.cn/315656.html 2.<说服力-让你的PPT会说话>秋叶 3.<三体> https://w ...

  6. Hibernate:More than one row with the given identifier was found解决办法

    今天写一个Action 通过 HQL 查询一个表 出现异常 “More than one row with the given identifier was found” 问题原因: 数据库出现数据异 ...

  7. 安装SSH2拓展 PHP上传文件到远程服务器

    情景:客户端上传图片到服务器A,服务器A同步上传至另外一个静态资源服务器B 环境:php7 linux(ubuntu) 安装php的ssh2扩展 -dev sudo apt-get install p ...

  8. appium常见问题05_修改Android手机运行环境(adb指令修改hosts)

    自动化测试过程中,手机有时会跳网,怎样保持手机测试的环境稳定性,可以通过adb指令修改android手机hosts,保持手机运行在hosts中配置的环境中: 修改方法如下: 前提条件:已安装andro ...

  9. shell 中 比较 diff

    diff 可以用来比较文件和文件夹是否相同 比较文件 diff file1 file2 >/dev/null 比较文件夹 diff -rNaq dir1 dir2 >/dev/null - ...

  10. 使用自编译的Emacs26.0.50build10版本,helm报错(已解决)

    使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...