- 浏览: 761359 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
Qt中线程安全的类有QMutex,QMutexLocker,QReadWriteLock,QReadLocker,QWriteLocker,QSemaphore(信号量),QThreadStorage<T>,QWaitCondition
结果是t1完全跑完后再跑t2:
t1
t1
t1
t1
t1
t2
t2
t2
t2
t2
也可以用QMutexLocker,这样是不是看起来更简单一点呢?
read与write的略有不同,读锁大家都可以读,写锁则只能一个一个写
生产者与消费者
stack is empty,wait producer!
produce:1
produce:2
consume:2
produce:3
produce:4
consume:3
produce:5
consume:5
produce:6
produce:7
stack is full,wait consumer!
consume:6
produce:8
stack is full,wait consumer!
consume:7
produce:9
stack is full,wait consumer!
consume:8
produce:10
consume:9
consume:10
consume:4
consume:1
#include<iostream> #include<QThread> #include<QMutex> #include<QWaitCondition> using namespace std; QMutex mutex; QWaitCondition wait1; class Thread1:public QThread{ public: void run(){ mutex.lock(); for(int i=0;i<5;i++){ msleep(500); cout << "t1" << endl; } mutex.unlock(); wait1.wakeOne(); } }; class Thread2:public QThread{ public: void run(){ wait1.wait(&mutex); for(int i=0;i<5;i++){ cout << "t2" << endl; } } }; int main(){ Thread1 t1; Thread2 t2; t1.start(); t2.start(); t1.wait(); t2.wait(); }
结果是t1完全跑完后再跑t2:
t1
t1
t1
t1
t1
t2
t2
t2
t2
t2
也可以用QMutexLocker,这样是不是看起来更简单一点呢?
#include<iostream> #include<QThread> #include<QMutex> #include<QMutexLocker> using namespace std; QMutex mutex; class Thread1:public QThread{ public: void run(){ QMutexLocker locker(&mutex); for(int i=0;i<5;i++){ msleep(500); cout << "t1" << endl; } } }; class Thread2:public QThread{ public: void run(){ QMutexLocker locker(&mutex); for(int i=0;i<5;i++){ cout << "t2" << endl; } } }; int main(){ Thread1 t1; Thread2 t2; t1.start(); t2.start(); t1.wait(); t2.wait(); } 结果同上
read与write的略有不同,读锁大家都可以读,写锁则只能一个一个写
#include<QReadWriteLock> #include<QFile> #include<QThread> #include<QTextStream> #include<iostream> #include<QTemporaryFile> #include<QReadLocker> using namespace std; QReadWriteLock readWriteLocker; const QString fileName = "test.txt"; void readFile(QFile& file){ QTextStream ts(&file); QString str = ts.readAll(); cout << str.toStdString() << endl; } class Read1:public QThread{ public: void run(){ //加了读锁后,如果sleep,后面的可以不用等,直接读 //但是如果这里是lockForWrite()的话,无论这里sleep多久,后面的线程都得等 readWriteLocker.lockForRead(); msleep(1000); QFile file(fileName); if(file.open(QIODevice::ReadWrite)){ cout << "read1 start reading..." << endl; readFile(file); } readWriteLocker.unlock(); file.close();//解锁后再关 } }; class Read2:public QThread{ public: void run(){ readWriteLocker.lockForRead(); QFile file(fileName); if(file.open(QIODevice::ReadWrite)){ cout << "read2 start reading..." << endl; readFile(file); }else{ cout << "can not open!" << endl; } readWriteLocker.unlock(); file.close(); } }; int main(){ Read1 r1; Read2 r2; r1.start(); r2.start(); r1.wait(); r2.wait(); } read2 start reading... This is a test file! read1 start reading... This is a test file!
生产者与消费者
#include<iostream> #include<QThread> #include<stack> #include<QMutex> #include<QWaitCondition> using namespace std; stack<int> sk; const int sum = 10; const int maxSize = 3; QMutex mutex; QWaitCondition producerWait; QWaitCondition consumerWait; class Producer:public QThread{ public: void run(){ for(int i=1;i<=sum;i++){ if(sk.size()==maxSize){ cout << "stack is full,wait consumer!" << endl; producerWait.wait(&mutex); } sk.push(i); //mutex.lock(); msleep(180); //mutex.unlock(); cout << "produce:" << i << endl; consumerWait.wakeAll(); } } }; class Consumer:public QThread{ public: void run(){ int i = 0; for(int j=1;j<=sum;j++){ if(sk.empty()){ cout << "stack is empty,wait producer!" << endl; consumerWait.wait(&mutex); } i = sk.top(); sk.pop(); //mutex.lock(); msleep(300); //mutex.unlock(); cout << "consume:" << i << endl; producerWait.wakeAll(); } } }; int main(){ Consumer con; Producer pro; pro.start(); con.start(); con.wait(); pro.wait(); }
stack is empty,wait producer!
produce:1
produce:2
consume:2
produce:3
produce:4
consume:3
produce:5
consume:5
produce:6
produce:7
stack is full,wait consumer!
consume:6
produce:8
stack is full,wait consumer!
consume:7
produce:9
stack is full,wait consumer!
consume:8
produce:10
consume:9
consume:10
consume:4
consume:1
发表评论
-
mac无法debug
2019-09-23 17:36 253升级新的lldb,底层脚本用的py3,而qtcreator暂不 ... -
现有项目生成pro文件
2018-07-21 15:32 1274qmake -project -
QtCreator使用arm编译器
2014-04-18 16:19 1219构建工具链各种不和谐,心一狠,直接改最原始的配置文件 1.首 ... -
qtcreator c++11
2013-07-15 22:10 1381在.pro里面:QMAKE_CXXFLAGS += -std= ... -
qt webkit
2013-03-28 17:27 814arora是一个很不错的开源的浏览器,我说它不错并不见得它的性 ... -
qt profile
2012-05-29 17:04 5378这篇文章是我从360doc上转的,本来是要把转的url列出来的 ... -
QtConcurrent
2012-05-26 14:48 2016当我们想在一个或多个辅助线程执行的同时做一些后台处理且无须使用 ... -
QThreadPool
2012-05-23 22:24 2197#include<QThreadPool> ... -
用qtcreator但不用qt库
2012-04-17 10:48 1307pro file: QT -= core gui -
qtcreator缺少编码
2012-04-14 13:46 874将plugins/codecs复制到yourcreator/b ... -
QTableView显示tooltip与设置日志
2012-01-11 22:15 3667原文http://www.cppblog.com/biao/a ... -
Qt mysql相关
2011-11-28 23:44 1788sudo apt-get install mysql-serv ... -
Qt自定义事件
2011-08-31 14:48 5305先看下官方的文档:(google translation) Q ... -
QComboBox下拉item变灰
2011-07-21 10:10 1933qobject_cast<QStandardItemMo ... -
Qt国际化
2011-07-21 09:37 9651.先在.pro中加入一行:TRANSLATIONS = xx ... -
Qt读写xml
2011-07-20 10:49 6458test.xml <?xml version=&qu ... -
生产者与消费者
2011-07-16 09:42 2#include<iostream> #in ... -
Qt读写二进制文件
2011-07-11 22:11 5677DataStream.h #ifndef DATASTRE ... -
QItemDelegate
2011-07-09 10:57 1886.h #ifndef DIALOG_H #define ... -
Qt的文本文件读写
2011-07-02 17:00 3257mainwindow.h #ifndef MAINWIND ...
相关推荐
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
本项目"qt多线程高效下载文件"是基于Qt实现的一个实用工具,它利用多线程技术来提高文件下载的效率,特别是对于大文件或者需要同时下载多个文件的场景,这种多线程策略显得尤为重要。 在HTTP协议方面,它是互联网上...
QT多线程实战源代码(QThread)是一个关于如何在QT框架中利用多线程进行高效编程的示例集合。QT是一个跨平台的C++库,广泛用于开发GUI应用程序,而QThread是QT提供的一种线程管理机制,使得开发者可以在QT环境中方便...
在“Qt多线程通讯”DEMO中,主线程可能创建了一个`QThread`实例,并启动它。接着,一个工作对象(可能是自定义的QObject派生类)被移动到子线程中。这个工作对象可能会有一个接收参数的槽函数,用于处理主线程传递...
本项目以"qt 多线程实现样例,实现文件的拷贝"为主题,通过使用 Qt 的 QThread 类来创建和管理后台线程,从而实现在后台执行文件拷贝任务,同时保持用户界面的流畅性。 Qt 中的多线程主要由 `QThread` 类提供支持,...
在Qt框架中,多线程编程是常见的需求,特别是在处理密集型计算或异步操作时。标题"Qt 多线程访问同一个变量"涉及到的是如何在多线程环境下确保对共享资源(此处为一个全局变量)的安全访问。描述中提到了使用互斥锁...
QT库是Qt公司开发的一款强大的跨平台应用程序开发框架,它提供了丰富的API用于创建GUI和非GUI应用程序。...通过学习和实践这些知识点,初学者可以逐步掌握QT多线程编程,为构建高效、响应迅速的应用程序打下坚实基础。
本文将深入探讨QT多线程编程的核心概念,主线程与子线程之间的数据交互以及如何在VS2017中进行实际应用。 首先,理解QT中的线程模型至关重要。在QT中,主线程通常负责用户界面的更新和事件处理,而子线程则可以执行...
**Qt多线程TCP服务器详解** 在开发网络应用程序时,多线程技术常常被用于提高服务器的并发处理能力。Qt库作为一个跨平台的C++框架,提供了丰富的功能,包括对网络编程的支持。本篇将深入讲解如何使用Qt构建一个多...
标题"Qt多线程测试代码"暗示了我们将探讨如何在Qt中使用多线程来执行耗时任务,以避免阻塞主线程导致用户界面(UI)无响应。在实际的软件开发中,这通常是提高用户体验的关键策略之一。 描述中提到,"Qt多线程多用于...
1. **Qt多线程**:Qt提供了QThread类来支持多线程编程。QThread是QObject的子类,这意味着我们可以在QThread上直接发送和接收信号与槽,这是Qt事件驱动模型的一部分。 2. **QObject和线程关联**:默认情况下,所有...
QT多线程技术在开发复杂的桌面应用程序时常常被用到,尤其在实现如聊天程序这样的实时交互应用中,它的优势尤为明显。这个“简单QT多线程聊天程序”旨在提供一个基础的学习平台,帮助开发者理解如何在QT环境中利用多...
这个实例“qt多线程实例-数据处理和UI界面显示”很可能是为了展示如何在不阻塞UI的情况下进行繁重的数据处理任务。 在单线程应用中,如果数据处理任务耗时较长,程序会冻结,用户界面无法响应,这将导致用户体验...
`moveToThread`函数是QT多线程编程中的一个重要方法,它允许我们将一个对象移动到指定的QThread对象中,从而使该对象的工作在新的线程上下文中执行。 首先,理解多线程的基本概念至关重要。在计算机科学中,线程是...
### Qt多线程编程知识点详解 #### 一、Qt多线程编程概述 在现代软件开发中,为了提高程序的响应速度和效率,多线程技术的应用变得越来越广泛。Qt作为一个跨平台的应用程序开发框架,提供了丰富的多线程支持。Qt的...
QT多线程调用摄像头录屏是一个涉及到计算机视觉、多媒体处理和并发编程的复杂任务。在本项目中,我们主要会使用OpenCV库来获取摄像头的视频流,Qt5框架来构建用户界面并处理多线程,以及FFmpeg工具来进行视频压缩。...
在本实例中,我们关注的是如何在Qt框架下使用多线程。Qt是一个功能丰富的C++库,广泛应用于GUI(图形用户界面)开发,同时也提供了强大的多线程支持。 标题“Qt 多线程.rar”暗示了这是一个关于使用Qt进行多线程...
本项目"qt多线程服务器文件传输"利用Qt的特性,构建了一个服务端程序,该程序能同时处理多个客户端的连接,并且能够并发地进行多个文件的传输任务。以下是对这一主题的详细解释: 1. **Qt中的多线程**: 在Qt中,...
本文将深入探讨如何使用Qt框架中的多线程功能,特别是结合QChart和QThread,来实现动态波形图表的高效展示。这对于理解和优化实时数据处理的软件系统具有重要意义。 首先,我们要理解Qt的QThread类。QThread是Qt...
本例中的"QT多线程小例子.zip"提供了两种在QT中实现多线程的方法,适用于QT5.7.0版本。 首先,我们来看"01Thread"这个例子,它展示了QT4中的多线程处理方式。在QT4中,我们可以使用QThread类直接创建和管理线程。在...