qt线程间理解共享内存QShareMemory

qt线程间的通信有其特有的信号与槽,也可通过共享内存的方式实现,下面演示如何使用QShareMemory实现线程间的共享内存;这里使用为简单的理解QShareMemory,并没有实现消费者和生产者的逻辑。

标题生产者端程序

头文件

#ifndef PRODUCERTHREAD_H
#define PRODUCERTHREAD_H
/**
* @file          producerthread.h
* @brief         生产者线程,用于向共享内存写入数据
* @author        yidong.yang
* @date          2019-10-15
* @hitstory      v2.0
*/
#include 
#include 
#include 
#include 

class ProducerThread: public QThread {
  public:
    ProducerThread();
  protected:
    void run() override;///>重写run函数
  private:
    bool stopped;
    QSharedMemory *producerShare;///>生产者共享内存
};

#endif // PRODUCERTHREAD_H

源文件

#include "producerthread.h"

ProducerThread::ProducerThread() {
    stopped = false;
    producerShare = new QSharedMemory();
    producerShare->setKey("share");///>设置共享内存的key值
    if(producerShare->isAttached()) {
        producerShare->detach();///>将该共享内存与进程分离
    }
    if(!producerShare->create(1024, QSharedMemory::ReadWrite)) {
        qDebug() << tr("can't create memory segment");
        qDebug() << producerShare->error();
    }
}

void ProducerThread::run() {
    while (!stopped) {
        //向共享内存中写入数据
        producerShare->lock();
        char *to = reinterpret_cast(producerShare->data());
        const char *from = "AnimationEnd";
        int size = static_cast(strlen(from) + 1);
        memcpy(to, from, static_cast(qMin(size, producerShare->size()))); //数据从该进程中拷贝到共享数据内存中
        producerShare->unlock();//共享内层解锁
        sleep(1);
    }
}

消费者端

头文件

#ifndef CONSUMERTHREAD_H
#define CONSUMERTHREAD_H
/**
* @file          consumerthread.h
* @brief         消费者线程,用于读取共享内存中的数据
* @author        yidong.yang
* @date          2019-10-15
* @hitstory      v2.0
*/
#include 
#include 
#include 
#include 

class ConsumerThread: public QThread {
  public:
    ConsumerThread();
  protected:
    void run() override;///>重写线程run函数
  private:
    bool stopped;///>线程结束控制变量
    QSharedMemory *consumerShare;///>消费者端
};

#endif // CONSUMERTHREAD_H

源文件

#include "consumerthread.h"

ConsumerThread::ConsumerThread() {
    stopped = false;
    consumerShare = new QSharedMemory();
    consumerShare->setKey("share");
    if(!consumerShare->attach(QSharedMemory::ReadOnly)) { //将sharedMemory与该进程绑定使之可以访问sharedMemory里的内容
        qDebug() << tr("can't attach share memory");
    }
}

void ConsumerThread::run() {
    while (!stopped) {
        //从贡献内存中读取数据,并发送至主线程显示
        qDebug() << "consumer" << QString::fromLocal8Bit(reinterpret_cast(consumerShare->data()));
        sleep(1);
    }
}

主程序使用

    produce = new ProducerThread();
    consumer = new ConsumerThread();
    produce->start();
    consumer->start();

你可能感兴趣的:(qt)