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多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
随机推荐
- 直击KubeCon 2018 |云原生正在改变你的衣食住行
云计算从不被看好到成长为势不可挡的技术潮流,仅仅用了十年的时间.如今“云原生”又被企业以及开发者奉为圭臬,并被认为是云计算的未来. 阿里云容器技术负责人易立认为云计算有三个阶段:云搬迁.云就绪和云原生 ...
- Nuget-Swagger-Swashbuckle:Swashbuckle
ylbtech-Nuget-Swagger-Swashbuckle:Swashbuckle 1.返回顶部 1. Seamlessly adds a Swagger to WebApi projects ...
- git私有仓库提交代码
#首次提交 #克隆版本库到本地 git clone http://192.168.3.107:9002/develop/zhong.git cd zhong #创建忽略文件(忽略文件自行编辑) tou ...
- Maven 上传文件 Error creating bean with name 'multipartResolver':
<!--配置MultipartResolver 处理文件上传--><bean id="multipartResolver" class="org.spr ...
- centosifcfg-eth0文件内容为空
虚拟机安装好CentOS 6系统后,发现ip在每次重启后都会还原,用ifconfig查看是有eth0网卡的(也有可能只有回环网卡lo),于是查看eth0网卡配置文件,发现在 /etc/sysconfi ...
- JAVA中的面向对象与内存解析_2
构造方法(构造函数) • 使用new +构造方法创建一个新的对象. • 构造函数是定义在Java类中的一个用来初始化对象的函数. • 构造函数与类同名且没有返回值. • 例如:Person类的构造 ...
- Visual C++中error spawning cl.exe解决办法
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天安装Vc6.0的时候出现了一个error spawning cl.exe的错误,在网上找了一些资料,才知道这是因为路径设置的问题引起的 ...
- Scapy——Scrapy shell的使用
在开发爬虫的使用,scrapy shell可以帮助我们定位需要爬取的资源 启动Scrapy Shell 在终端中输入以下内容即可启动scrapy shell,其中url是要爬取的页面,可以不设置 sc ...
- SQL语句优化方式
不要使用*号进行查询操作,使用具体字段. 索引 在where子句和order by 涉及的字段上合理的添加索引. where 子句优化 避免在where子句中对null值进行判断,应对字段设置默认值 ...
- log4j基础配置使用
添加log4j的jar包:可以从maven处下载:https://mvnrepository.com/artifact/log4j/log4j/1.2.17 <!-- https://mvnre ...