Qt---多线程控制
来源:互联网 发布:noteshelf软件功能 编辑:程序博客网 时间:2024/06/07 19:51
1、QMutex
#include <QMutex>class Key{private: int key; QMutex mutex;public: Key() { key = 0; } int creatKey() { mutex.lock(); ++key; return key; mutex.unlock(); } int value() const { mutex.lock(); return key; mutex.unlock(); }};
2、QMutexLocker
#include <QMutex>#include <QMutexLocker>class Key{private: int key; QMutex mutex;public: Key() { key = 0; } int creatKey() { QMutexLocker.locker(&mutex); ++key; return key; } int value() const { QMutexLocker.locker(&mutex); return key; }};
3、QSemaphore
.pro中的更改
QT += coreQT -= guiCONFIG += consoleCONFIG -= app_bundle
main.cpp
#include <QCoreApplication>#include <QSemaphore>#include <QThread>#include <stdio.h>const int DataSize = 1000;const int BufferSize = 80;int buffer[BufferSize];QSemaphore freeBytes(BufferSize); //空闲字节的数量QSemaphore usedBytes(0); //被数据占用字节的数量class Producer:public QThread{public: Producer(); void run();};Producer::Producer(){}void Producer::run(){ for(int i=0; i<DataSize; i++) { freeBytes.acquire(); //如果空闲字节数为0,生产者睡眠;否则,生产者生产数据 buffer[i%BufferSize] = (i%BufferSize); usedBytes.release(); //唤醒消费者 }}class Consumer:public QThread{public: Consumer(); void run();};Consumer::Consumer(){}void Consumer::run(){ for(int i=0; i<DataSize; i++) { usedBytes.acquire(); //如果没有数据,消费者睡眠;否则,消费者消耗数据 fprintf(stderr, "%d", buffer[i%BufferSize]); if(i % 16 == 0 && i != 0) fprintf(stderr, "\n"); freeBytes.release(); //唤醒生产者 } fprintf(stderr, "\n");}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return a.exec();}
4、线程等待与唤醒
.pro中的更改
QT += coreQT -= guiCONFIG += consoleCONFIG -= app_bundle
main.cpp
#include <QCoreApplication>#include <QWaitCondition>#include <QMutex>#include <QThread>#include <stdio.h>const int DataSize = 1000;const int BufferSize = 80;int buffer[BufferSize];QWaitCondition bufferEmpty;QWaitCondition bufferFull;QMutex mutex;int numUsedBytes = 0;int rIndex = 0;class Producer:public QThread{public: Producer(); void run();};Producer::Producer(){}void Producer::run(){ for(int i=0; i<DataSize; i++) { mutex.lock(); if(numUsedBytes == BufferSize) //如果缓冲区已满,则生产者睡眠 bufferEmpty.wait(&mutex); buffer[i%BufferSize] = numUsedBytes; ++numUsedBytes; bufferFull.wakeAll(); //唤醒消费者 mutex.unlock(); }}class Consumer:public QThread{public: Consumer(); void run();};Consumer::Consumer(){}void Consumer::run(){ forever { mutex.lock(); if(numUsedBytes == 0) //如果缓冲区空,消费者睡眠 bufferFull.wait(&mutex); printf("%ul::[%d]= %d\n", currentThreadId(), rIndex, buffer[rIndex]); rIndex = (++rIndex) % BufferSize; --numUsedBytes; bufferEmpty.wakeAll(); //唤醒生产者 mutex.unlock(); } printf("\n");}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); Producer producer; Consumer consumerA; Consumer consumerB; producer.start(); consumerA.start(); consumerB.start(); producer.wait(); consumerA.wait(); consumerB.wait(); return a.exec();}
0 0
- Qt---多线程控制
- Qt中多线程系列之线程控制
- Qt中多线程系列之线程控制
- Qt多线程
- Qt多线程
- Qt多线程
- qt 多线程
- Qt多线程
- QT多线程
- QT多线程
- QT多线程
- Qt多线程
- qt 多线程
- Qt多线程
- QT 多线程
- qt 多线程
- qt多线程
- Qt 多线程
- R 语言语法快速浏览
- ld: 6 duplicate symbols for architecture x86_64 clang: error: linker command的解决方法
- 字符串分割
- SCU2016-01 K找规律
- 利用js 判断浏览器类型
- Qt---多线程控制
- 显示和隐藏元素display&&visibility
- hdu 1394 Minimum Inversion Number 线段树求逆序数
- 【zTree】修改节点图标
- hdu 4901 The Romantic Hero
- 再论mysql线程出现Waiting for table flush被hang住问题
- 二叉树深度与宽度
- 老曹的忧郁
- NoSql入门和概述