共享内存即两个(或多个)程序共享操作系统中的一块空间,这样程序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 ¶)
{
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();
}