- 浏览: 718922 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1042)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (52)
- 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 (33)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (64)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
最新评论
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 228升级新的lldb,底层脚本用的py3,而qtcreator暂不 ... -
现有项目生成pro文件
2018-07-21 15:32 1226qmake -project -
QtCreator使用arm编译器
2014-04-18 16:19 1185构建工具链各种不和谐,心一狠,直接改最原始的配置文件 1.首 ... -
qtcreator c++11
2013-07-15 22:10 846在.pro里面:QMAKE_CXXFLAGS += -std= ... -
qt webkit
2013-03-28 17:27 768arora是一个很不错的开源的浏览器,我说它不错并不见得它的性 ... -
qt profile
2012-05-29 17:04 5347这篇文章是我从360doc上转的,本来是要把转的url列出来的 ... -
QtConcurrent
2012-05-26 14:48 1970当我们想在一个或多个辅助线程执行的同时做一些后台处理且无须使用 ... -
QThreadPool
2012-05-23 22:24 2161#include<QThreadPool> ... -
用qtcreator但不用qt库
2012-04-17 10:48 1247pro file: QT -= core gui -
qtcreator缺少编码
2012-04-14 13:46 842将plugins/codecs复制到yourcreator/b ... -
QTableView显示tooltip与设置日志
2012-01-11 22:15 3606原文http://www.cppblog.com/biao/a ... -
Qt mysql相关
2011-11-28 23:44 1760sudo apt-get install mysql-serv ... -
Qt自定义事件
2011-08-31 14:48 5264先看下官方的文档:(google translation) Q ... -
QComboBox下拉item变灰
2011-07-21 10:10 1859qobject_cast<QStandardItemMo ... -
Qt国际化
2011-07-21 09:37 9151.先在.pro中加入一行:TRANSLATIONS = xx ... -
Qt读写xml
2011-07-20 10:49 6391test.xml <?xml version=&qu ... -
生产者与消费者
2011-07-16 09:42 2#include<iostream> #in ... -
Qt读写二进制文件
2011-07-11 22:11 5630DataStream.h #ifndef DATASTRE ... -
QItemDelegate
2011-07-09 10:57 1844.h #ifndef DIALOG_H #define ... -
Qt的文本文件读写
2011-07-02 17:00 3203mainwindow.h #ifndef MAINWIND ...
相关推荐
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
qt多线程下载文件的Demo,支持http协议,支持多任务下载
适合初学者的QT多线程操作的例子 适合初学者的QT多线程操作的例子
qt 多线程实现样例,实现文件的拷贝,亲测可用,重新编译即可
qt多线程实例-数据处理和UI界面显示
QT多线程实战源码,用到线程间通信等内容。 博客地址:https://tinycool.blog.csdn.net/article/details/124298084
Qt多线程多用于解决用户界面调用一个比较耗时的操作而导致界面冻结的问题。在此从实际的开发中总结多线程的应用。
Qt+Opencv+QThread,Qt多线程同时显示多路USB摄像头信息至ui界面, 请注意,每个USB摄像头应单独连接至PC机,不能将多个USB摄像头连接在同一个USB hub上再连接PC机; 适用于刚接触Opencv,Qt,希望通过Qt结合Opencv...
qt 多线程 防止主线程做循环操作导致界面假死。试过多线程的几种方法,只有这个方法可行。代码亲测可行。在子线程死循环,界面正常不死!!!
Qt 多线程实现波形图标,一个简单的例子,初学者很容易懂,主要是多线程处理数据,发回ui 线程去显示,防止单线程时,数据量大卡死
多线程通信,QT5.11.1,多线程TCP服务器,多线程连接客户端。QThread
Qt Creator 多线程读取文件到程序显示 利用QT Creator多任务读取一个文档到程序里 为了防止直接读取文件里的内容太大而发生卡顿,于是多线程读取将更高效的解决这个问题。 效果图如下: 其中pro文件无需改动,...
环境QT5.7.0 QT多线程两种方式的简单例子:通过线程处理更新ui界面的时间显示 01Thread是QT4的方式,02Thread是QT5的方式,02方式更灵活一些,01更简单快捷
1.Qt下,多线程使用互斥锁安全访问同一全局变量;2.源码中定义了ThreadA和ThreadB,定义变量后,依次调用函数start()来启动重写的run()函数
基于QT多线程下载软件的设计与实现包含毕设论文以及开题报告等全部文档
Qt多线程程序发布需要用到这个动态库,支持Qt5以后的版本,mingw版本
QT QSemaphore实现了线程同步,详细细节请参考https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5113 博客QT多线程篇
qt多线程传输文件的静态编译版本,qt多线程传输文件的静态编译版本
最近在学基于c++的qt开发库,这是一个c++与qt多线程的一个简单代码示例
Qt线程间共享数据主要有两种方式: 1)使用共享内存。即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的。 2)使用singal/slot机制,把数据从一个...