zoukankan      html  css  js  c++  java
  • QSharedMemory 使用

    转载

    初始化

    1. 实例化QSharedMemory对象
    2. 指定关键字key

    开始通信

    1. 进程A写:
    • 检测该进程是否连接到共享内存段,如果连接,则将该进程与共享内存段分离。
    • 从系统足够大的内存中得到一个新的共享内存段。
    • 锁定该共享内存段,以阻止第二个对话框进程访问。
    • 开始进行写操作。
    • 将共享内存段解锁,然后第二个对话框进程就可以访问了。
    1. 进程B读:
    • 将该进程与进程A创建的共享内存段绑定
    • 锁定共享内存段。
    • 开始进行读操作。
    • 将共享内存段解锁,然后将该进程与共享内存段分离。

    代码段

    void Dialog::loadFromFile()
    {
        if (sharedMemory.isAttached())
        {
            // 将该进程与共享内存段分离
            if (!sharedMemory.detach())
                qDebug() << "Unable to detach from shared memory.";
        }
    
        QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(),
                                            tr("Images (*.png *.xpm *.jpg)"));
        QImage image;
        if (!image.load(fileName))
        {
            qDebug() << "Selected file is not an image, please select another.";
            return;
        }
    
        // 将数据加载到共享内存中
        QBuffer buffer;
        buffer.open(QBuffer::ReadWrite);
        QDataStream out(&buffer);
        out << image;
        int size = buffer.size();
    
        // 创建共享内存段
        if (!sharedMemory.create(size))
        {
            qDebug() << sharedMemory.errorString() << "
     Unable to create shared memory segment.";
            return;
        }
        sharedMemory.lock();
        char *to = (char*)sharedMemory.data();
        const char *from = buffer.data().data();
        memcpy(to, from, qMin(sharedMemory.size(), size));
        sharedMemory.unlock();
    }
    
    void MainWindow::loadFromMemory()
    {
        // 将共享内存与该进程绑定
        if (!sharedMemory.attach())
        {
            qDebug() << "Unable to attach to shared memory segment.";
            return;
        }
    
        // 从共享内存中读取数据
        QBuffer buffer;
        QDataStream in(&buffer);
        QImage image;
    
        sharedMemory.lock();
        buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
        buffer.open(QBuffer::ReadOnly);
        in >> image;
        sharedMemory.unlock();
    
        sharedMemory.detach();
        m_pLabel->setPixmap(QPixmap::fromImage(image));
    }
    

    参考:Qt学习—qt共享内存的使用

    参考:qt 共享内存(QSharedMemory)

    转载:Qt 之进程间通信(共享内存)

  • 相关阅读:
    Emulator PANIC: Could not open: AVD2.3.1
    VC++ 6.0 快捷键
    eclipse 中文版 变成 英文版 方法
    SharedPreferences 用法
    subString
    Android键盘属性
    【Android异常】The specified child already has a parent. You must call removeView() on the child's parent first.
    ListView的ScrollListener
    Android 自定义格式的对话框
    Android ListView 设置
  • 原文地址:https://www.cnblogs.com/Doyoung/p/13523602.html
Copyright © 2011-2022 走看看