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
原创粉丝点击