• Python 共享内存与 Qt c++ 程序进程之间通信


    Python 共享内存 与 Qt c++ 程序进程之间通信

    这里Python 使用 shared_memory
    QT 使用 QSharedMemory

    简单协议:
    第一个是数据长度
    后面是数据

    python 代码:

    from multiprocessing import  shared_memory
    import numpy as np
    from PIL import Image
    
    import matplotlib.pyplot as plt
    
    
    if __name__ == "__main__":
    
        # python创建的共享内存的名称
        # 对应QSharedMemory 的 nativeKey
        shared_memory_key = "my_share_mem"  
    	
    	# [数据长度=15 数据=1-15]
        origin_data = np.array([15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
        print(f"origin_data.dtype : {origin_data.dtype}")
    
        #------------- 数据写入共享内存
    
        # 创建共享内存对象
        shm_a = shared_memory.SharedMemory(create=True, name=shared_memory_key,size=origin_data.nbytes)
    
        #构造关联共享内存的数组
        mem_array = np.ndarray(origin_data.shape, dtype=origin_data.dtype, buffer=shm_a.buf)
    
        #copy 数据到共享内存
        mem_array[:]=origin_data[:]
    
        print(f"------------mem_array------------:\n{mem_array}\n")
        print(f"shm_a : {shm_a}")
    
    
        # 显示一张图片,阻止进程结束,等待Qt c++程序 访问共享内存
        img_path = "C:\\Users\\mingxingwang\\Pictures\\qt-logo.png"
        # 打开图片并转换为numpy数组
        img = Image.open(img_path)
        plt.imshow(img)
        plt.show()
    
        # 关闭共享内存
        shm_a.close()
        shm_a.unlink()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    运行查看打印:

    origin_data.dtype : int32
    ------------mem_array------------:
    [15  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
    
    shm_a : SharedMemory('my_share_mem', size=64)   
    
    • 1
    • 2
    • 3
    • 4
    • 5

    QT 程序

    #include 
    #include 
    #include 
    
    	QSharedMemory *sm;
        sm = new QSharedMemory();
    
    	// sm->setKey("my_share_mem");
        /// 与非Qt 程序通信 setNativeKey
        sm->setNativeKey("my_share_mem");
        
        if(!sm->attach())
        {
            qDebug()<<"attach error";
            return;
        }
        qDebug() << "attach success";
    
        QBuffer buffer;
    
        sm->lock();
        buffer.setData((char*)sm->data(),sm->size());
        sm->unlock();
        sm->detach();
    
        if(!buffer.open(QBuffer::ReadOnly))
        {
            qDebug()<<"open buffer error";
            return;
        }
    
        QDataStream in(&buffer);
        in.setByteOrder(QDataStream::LittleEndian);
    
        int len=0;
        int tmp=0;
        in >> len;
        qDebug()<<"len"<<len;
        for(int i=0;i<len;i++)
        {
            in >>tmp;
            qDebug()<<QString::asprintf("buf[%d] = %04x",i,tmp);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    运行查看打印:

    attach success
    len 15
    "buf[0] = 0001"
    "buf[1] = 0002"
    "buf[2] = 0003"
    "buf[3] = 0004"
    "buf[4] = 0005"
    "buf[5] = 0006"
    "buf[6] = 0007"
    "buf[7] = 0008"
    "buf[8] = 0009"
    "buf[9] = 000a"
    "buf[10] = 000b"
    "buf[11] = 000c"
    "buf[12] = 000d"
    "buf[13] = 000e"
    "buf[14] = 000f"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    软件设计不是CRUD(4):耦合度的强弱(上)
    QT 之数据库 QSqlQuery CURD 实战
    java类的访问权限
    追求性能极致:客户端缓存带来的革命
    wordpress添加评论过滤器
    S25FL256S介绍及FPGA实现思路
    RocketMQ 消费者拉取消息(Pull) 解析——图解、源码级解析
    【云原生】项目上云最佳实践
    git commit 提交校验详解
    ClickHouse多种安装方式
  • 原文地址:https://blog.csdn.net/WMX843230304WMX/article/details/133137338