Qt中的进程通信1 - 共享内存

共享内存即两个(或多个)程序共享操作系统中的一块空间,这样程序1就可以把想传给程序2的数据放到共享内存中,然后程序2去读取共享内存,这样通过间接的一种方式实现了程序间的数据传输。

下面例子展示了在程序1打开时,程序2通过命令行参数给程序1传递这个参数的功能。


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QSharedMemory>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void setSharedMemoryData(const QString &);

private:
    Ui::MainWindow *ui;

    QSharedMemory *sharedMemory;        // 共享内存段(新打开实例给已存在实例发送消息)
    QTimer *timer;                      // 计时器循环以感知共享内存
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QtGui>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // init sharedmemory
    sharedMemory = new QSharedMemory("Qt5Test", this);
    sharedMemory->attach();     // 附着旧的共享内存并释放掉
    sharedMemory->detach();
    timer = new QTimer(this);
    timer->start(1500);
    connect(timer, &QTimer::timeout, [this]()
    {
        if(this->objectName() == "temp")    return;

        if(sharedMemory->attach())
        {
            QBuffer buffer;
            QDataStream in(&buffer);
            sharedMemory->lock();
            buffer.setData((char*)sharedMemory->constData(), sharedMemory->size());
            buffer.open(QBuffer::ReadOnly);
            QString input_para;
            in >> input_para;
            sharedMemory->unlock();
            sharedMemory->detach();
            if(!input_para.isEmpty())
            {
                sharedMemory->detach();
                qDebug() << input_para;
            }
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::setSharedMemoryData(const QString &para)
{
    if(sharedMemory->isAttached())
        if(!sharedMemory->detach())    exit(0);

    this->setObjectName("temp");

    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out(&buffer);
    out << para;
    int size = buffer.size();

    if(!sharedMemory->create(size))
    {
        qDebug() << "Unable to create shared memory segment.";
        qDebug() << sharedMemory->errorString();
        exit(0);
    }
    sharedMemory->lock();
    char *to = (char*)sharedMemory->data();
    const char *from = buffer.data().data();
    memcpy(to, from, qMin(sharedMemory->size(), size));
    sharedMemory->unlock();
    qDebug() << tr("已发送参数:%1").arg(para);

    // waitting 3 seconds, then exit
    QTime t;
    t.start();
    while(t.elapsed() < 3000)   QCoreApplication::processEvents();
    exit(0);
}

main.cpp

#include "mainwindow.h"

#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;

    QString _para = QString(argv[1]);
    if(!_para.isEmpty())
    {
        w.setSharedMemoryData(_para);
    }

    w.show();
    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值