QT多线程学习
一、想要使用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多线程学习的更多相关文章
- [转] Qt 多线程学习
Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...
- Qt 多线程学习
最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ GUI Qt4 编程>来学习. 这本书的第14章是关于多线程的知识,使用的Qt版本是Qt4.x.在下用的是最新 ...
- Qt多线程学习:创建多线程
[为什么要用多线程?] 传统的图形用户界面应用程序都仅仅有一个运行线程,而且一次仅仅运行一个操作.假设用户从用户界面中调用一个比較耗时的操作,当该操作正在运行时,用户界面一般会冻结而不再响应.这个问题 ...
- Qt多线程学习-用例子来理解多线程(转),这个是我看过最好的文章,总结很详细(感觉exec()的作用就是保持线程不退出,这样方便随时处理主线程发来的信号,是一种非常别致的思路)good
01 class MThread :public QThread 02 { 03 public: 04 MThread(); 05 ~MThread(); 06 virtual ...
- Qt多线程学习-用例子来理解多线程
文章出处:DIY部落(http://www.diybl.com/course/3_program/c/c_js/20090303/157373_3.html) POINT 1:QThread类的实例与 ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- QT入门学习笔记2:QT例程
转至:http://blog.51cto.com/9291927/2138876 Qt开发学习教程 一.Qt开发基础学习教程 本部分博客主要根据狄泰学院唐老师的<QT实验分析教程>创作,同 ...
- 【QT】 Qt多线程的“那些事”
目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
随机推荐
- Angular JS - 1 - 环境准备
1.webstorm 下载安装 webstorm 同 intellij IDEA 一样智能好用~ 智能的同时,比较费内存 2. chrome插件安装 按照下图,打开扩展程序,选择开发者模式: 下载n ...
- LDD3 第10章 中断处理
各种硬件和处理器打交道的周期不同,并且总是比处理器慢.必须有一种可以让设备在产生某个事件时通知处理器----中断. 中断仅仅是一个信号,如果硬件需要,就可以发送这个信号.Linux处理中断方式和用户空 ...
- HDU - 6621 K-th Closest Distance 主席树+二分答案
K-th Closest Distance 主席树第二波~ 题意 给你\(n\)个数\(m\)个询问,问\(i\in [l,r]\)计算每一个\(|a_{i}-p|\)求出第\(k\)小 题目要求强制 ...
- 树结构遍历节点名字提取,这里提取的是el-tree数据结构,封装成函数
/** * 树形数据提取节点 * @param {*} data */ export function treeDataGetnode (data) { var res = [] var child= ...
- PPT技巧
1.秋叶个人的PPT三分钟教程 http://www.pptfans.cn/315656.html 2.<说服力-让你的PPT会说话>秋叶 3.<三体> https://w ...
- Hibernate:More than one row with the given identifier was found解决办法
今天写一个Action 通过 HQL 查询一个表 出现异常 “More than one row with the given identifier was found” 问题原因: 数据库出现数据异 ...
- 安装SSH2拓展 PHP上传文件到远程服务器
情景:客户端上传图片到服务器A,服务器A同步上传至另外一个静态资源服务器B 环境:php7 linux(ubuntu) 安装php的ssh2扩展 -dev sudo apt-get install p ...
- appium常见问题05_修改Android手机运行环境(adb指令修改hosts)
自动化测试过程中,手机有时会跳网,怎样保持手机测试的环境稳定性,可以通过adb指令修改android手机hosts,保持手机运行在hosts中配置的环境中: 修改方法如下: 前提条件:已安装andro ...
- shell 中 比较 diff
diff 可以用来比较文件和文件夹是否相同 比较文件 diff file1 file2 >/dev/null 比较文件夹 diff -rNaq dir1 dir2 >/dev/null - ...
- 使用自编译的Emacs26.0.50build10版本,helm报错(已解决)
使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...