一、想要使用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. mybatis模糊查询(转载)

    原文地址:http://blog.csdn.net/luqin1988/article/details/7865643 模糊查询: 1. sql中字符串拼接 SELECT * FROM tableNa ...

  2. SpringMVC的 ModelAndView

    使用ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图. public class ModelAndView { /** View instance or view name ...

  3. webpack对脚本和样式的处理

    一.对js处理 webpack本身支持js加载也可以用插件. 1.加载要全局使用的插件比如jquery 在页面用cdn方式引用,然后再webpack.config.js里配置.会让jquery成为全局 ...

  4. LOJ 3058 「HNOI2019」白兔之舞——单位根反演+MTT

    题目:https://loj.ac/problem/3058 先考虑 n=1 怎么做.令 a 表示输入的 w[1][1] . \( ans_t = \sum\limits_{i=0}^{L}C_{L} ...

  5. hashmap:cr:csdn

    HashMap相关问题 1.你用过HashMap吗?什么是HashMap?你为什么用到它? 用过,HashMap是基于哈希表的Map接口的非同步实现,它允许null键和null值,且HashMap依托 ...

  6. redis哨兵-5

    #地址: https://www.cnblogs.com/PatrickLiu/p/8444546.html #常用架构 redis1主1从+3哨兵 实现redis高可用 #redis主从 ##### ...

  7. html&css面试笔记

    1.CSS选择器有哪些?它们的优先级是怎样的? 选择器类型: id选择器 ( # myid) 类选择器 (.myclassname) 标签选择器 (div, h1, p) 相邻选择器 (h1 + p) ...

  8. Visual Studio Code - 调试 Node.js 代码

    官方的文档写的太好了!大家还是看参考资料吧. 参考资料: Debugging in Visual Studio Code Debug Node.js Apps using Visual Studio ...

  9. linux执行时间段内日志关键字搜索

    sed -n '/起始时间/,/结束时间/p' 日志文件 | grep '关键字' 查询文件debug.log在2019-11-18 08:00:00~2019-11-18 08:21:00时间段内e ...

  10. centOS不显示ipv4地址的解决办法

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lx_Frolf/article/deta ...