标签: it
进程间通信方式有四种方式:
1.使用共享内存
2.TCP/IP通信
3.D-BUS
4.QCOP
这里,先说共享内存方式,因为这种方式用的比较多,而且,容易理解;具体的步骤如下:
提供共享的步骤:
A.定义QSharedMemory变量,并调用setKey()设置标志变量
B.将共享内存与主进程进行分离:detach()
C.创建共享内存:create()
D.共享内存上锁:lock()
E.将数据写入共享内存:
F.解锁unlock()
从共享中读取数据的一方:
A.定义QSharedMemory变量,并调用setKey()设置标志变量 PS:变量名要一致
B.将共享内存上锁lock()
C.将共享内存与主进程绑定attach
D.从共享内存取数据
E.解锁unlock()
F.与共享内存分离detach()
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWidget>
#include <QSharedMemory>
#include <QToolButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QGridLayout>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
//分享内存共享的代码
QSharedMemory sharemem;
//分享内存
void sharing();
//读取内存共享的代码
QSharedMemory sharedMem;
QToolButton *m_btn;
QLabel *m_lbl;
QGridLayout *m_mainLayout;
private slots:
//读取内存
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QBuffer>
#include <QDataStream>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MainWindow)
{
//ui->setupUi(this);
m_btn = new QToolButton(this);
//m_btn->setAutoRaise(true);
m_btn->setText("btn");
m_lbl = new QLabel(this);
m_lbl->setText("Label");
m_mainLayout = new QGridLayout(this);
m_mainLayout->addWidget(m_lbl);
m_mainLayout->addWidget(m_btn);
this->setLayout(m_mainLayout);
connect(m_btn, &QToolButton::clicked, this, &MainWindow::on_pushButton_clicked);
sharemem.setKey("sharing");
sharing();
sharedMem.setKey("sharing");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::sharing()
{
QString strText = "This is a SharedText";
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream stream(&buffer);
stream << strText;
int iSize = buffer.size();
if(sharemem.isAttached())
{
sharemem.detach();
}
if(sharemem.create(iSize))
{
sharemem.lock();
char* to = (char*) sharemem.data();
const char* from = buffer.data();
memcpy(to, from, qMin(sharemem.size(), iSize));
sharemem.unlock();
}
}
void MainWindow::on_pushButton_clicked()
{
sharedMem.lock();
if(!sharedMem.isAttached())
{
sharedMem.attach();
}
int iSize = sharedMem.size();
QByteArray byteArr;
byteArr.resize(iSize);
char *to = byteArr.data();
char *from = (char*) sharedMem.data();
memcpy(to, from, iSize);
QDataStream stream(&byteArr, QIODevice::ReadOnly);
QString strText;
stream >> strText;
sharedMem.unlock();
sharedMem.detach();
//QMessageBox::Warning(0, strText,);
m_lbl->setText(strText);
}