QT进程间通信(一)

标签: 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);

}









































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值