赞
踩
QSharedMemory sharedMemory("MySharedMemory");
等价于
QSharedMemory sharedMemory;
sharedMemory->setKey("MySharedMemory");
if (!sharedMemory->create(1024)) { // 创建1024字节的共享内存
qDebug() << "Failed to create shared memory";
}
pShareM = new QSharedMemory;
pShareM->setKey("MySharedMemory");//设置同一个共享内存区域
if (!pShareM->attach()) {// 连接到共享内存
qDebug() << "Failed to attach to shared memory";
}
//写入数据 if (sharedMemory.lock()) { char *to = static_cast<char *>(sharedMemory.data()); strcpy(to, "Hello from Qt!");//关键代码 sharedMemory.unlock(); } else { qDebug() << "Failed to lock shared memory for writing"; } //读取数据 if (sharedMemory.lock()) { char *from = static_cast<char *>(sharedMemory.data()); qDebug() << "Data from shared memory:" << from;//关键代码 sharedMemory.unlock(); } else { qDebug() << "Failed to lock shared memory for reading"; }
sharedMemory.detach();
sharedMemory.destroy();
//主进程 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QProcess> #include <QSharedMemory> #include <QFile> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); // 初始化 QProcess 对象,并连接信号到槽 pSubP = new QProcess(this); connect(pSubP, SIGNAL(started()), this, SLOT(pSubStartedSlotFun())); // 当子进程启动时 connect(pSubP, SIGNAL(finished(int)), this, SLOT(pSubPFinishedSlotFun(int))); // 当子进程完成时 connect(pSubP, SIGNAL(readyReadStandardOutput()), this, SLOT(readSubPOutput())); // 子进程有标准输出数据时 // 启动子进程,并指定子进程的执行程序路径 pSubP->start("/mnt/hgfs/linux_learn/qt_file/process/sub/build-project7_24_vice_process-Desktop_Qt_5_12_9_GCC_64bit-Debug/project7_24_vice_process"); // 设置子进程的标准输入和标准输出文件 pSubP->setStandardInputFile("/path/to/input.txt"); // 设置标准输入来源为指定文件 pSubP->setStandardOutputFile("/path/to/output.txt"); // 设置标准输出目的地为指定文件 // 初始化共享内存 pShareM = new QSharedMemory(this); pShareM->setKey("zhhhhhhhhhhhhhhz"); // 设置共享内存的唯一标识符 // 创建共享内存,大小为128字节 if (!pShareM->create(128)) { qDebug() << "Failed to create shared memory"; // 创建失败时输出调试信息 } else { qDebug() << "Shared memory created"; // 创建成功时输出调试信息 } // 连接按钮点击信号到槽函数 connect(ui->btnWrite, SIGNAL(clicked()), this, SLOT(btnWriteClickedSlotFun())); // 当点击写入按钮时 connect(ui->btnRead, SIGNAL(clicked()), this, SLOT(btnReadClickedSlotFun())); // 当点击读取按钮时 connect(ui->btnTerminate, SIGNAL(clicked()), this, SLOT(btnTerminateClickedSlotFun())); // 当点击终止按钮时 connect(ui->btnKill, SIGNAL(clicked()), this, SLOT(btnKillClickedSlotFun())); // 当点击杀死按钮时 } Widget::~Widget() { delete ui; // 解除共享内存的连接 if (pShareM->isAttached()) { pShareM->detach(); } } void Widget::pSubStartedSlotFun() { qDebug() << "Sub process started"; // 子进程启动时输出调试信息 } void Widget::pSubPFinishedSlotFun(int exitCode) { qDebug() << "Sub process finished with exit code:" << exitCode; // 子进程结束时输出调试信息,包含退出码 } void Widget::readSubPOutput() { // 读取子进程的标准输出 QByteArray output = pSubP->readAllStandardOutput(); qDebug() << "Output from sub process:" << output; // 输出子进程的标准输出数据 } void Widget::btnWriteClickedSlotFun() { // 获取文本框中的文本 QString str = ui->textEdit->toPlainText(); std::string sstr = str.toStdString(); const char *p = sstr.c_str(); // 写入数据到共享内存 if (pShareM->lock()) { // 锁定共享内存以确保数据安全写入 memcpy(pShareM->data(), p, sstr.length()); // 复制数据到共享内存 pShareM->unlock(); // 解锁共享内存 qDebug() << "Data written to shared memory"; // 输出写入数据成功的调试信息 } else { qDebug() << "Failed to lock shared memory for writing"; // 锁定共享内存失败时输出调试信息 } } void Widget::btnReadClickedSlotFun() { // 从共享内存中读取数据 if (pShareM->lock()) { // 锁定共享内存以确保数据安全读取 char *from = static_cast<char *>(pShareM->data()); // 获取共享内存的数据指针 ui->textEdit->setText(from); // 将读取到的数据设置到文本框中 pShareM->unlock(); // 解锁共享内存 qDebug() << "Data read from shared memory"; // 输出读取数据成功的调试信息 } else { qDebug() << "Failed to lock shared memory for reading"; // 锁定共享内存失败时输出调试信息 } } void Widget::btnTerminateClickedSlotFun() { pSubP->terminate(); // 请求子进程正常终止 pSubP->waitForFinished(); // 等待子进程终止 qDebug() << "Sub process terminated"; // 输出子进程终止的调试信息 } void Widget::btnKillClickedSlotFun() { pSubP->kill(); // 强制杀死子进程 pSubP->waitForFinished(); // 等待子进程结束 qDebug() << "Sub process killed"; // 输出子进程被杀死的调试信息 } //被启动进程的代码 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QSharedMemory> #include <QFile> #include <QTextStream> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); // 初始化共享内存 pShareM = new QSharedMemory(this); pShareM->setKey("zhhhhhhhhhhhhhhz"); // 设置共享内存的唯一标识符 // 尝试连接到共享内存 if (!pShareM->attach()) { // 连接到已经存在的共享内存 qDebug() << "Failed to attach to shared memory"; // 连接失败时输出调试信息 } else { qDebug() << "Attached to shared memory"; // 连接成功时输出调试信息 } // 连接按钮点击信号到槽函数 connect(ui->btnRead, SIGNAL(clicked()), this, SLOT(btnReadClickedSlotFun())); // 当点击读取按钮时 connect(ui->btnWrite, SIGNAL(clicked()), this, SLOT(btnWriteClickedSlotFun())); // 当点击写入按钮时 } Widget::~Widget() { delete ui; // 解除共享内存的连接 if (pShareM->isAttached()) { pShareM->detach(); } } void Widget::btnReadClickedSlotFun() { // 从共享内存中读取数据 if (pShareM->lock()) { // 锁定共享内存以确保数据安全读取 char *from = static_cast<char *>(pShareM->data()); // 获取共享内存的数据指针 ui->textEdit->setText(from); // 将读取到的数据设置到文本框中 pShareM->unlock(); // 解锁共享内存 qDebug() << "Data read from shared memory"; // 输出读取数据成功的调试信息 } else { qDebug() << "Failed to lock shared memory for reading"; // 锁定共享内存失败时输出调试信息 } } void Widget::btnWriteClickedSlotFun() { // 获取文本框中的文本 QString str = ui->textEdit->toPlainText(); std::string sstr = str.toStdString(); const char *p = sstr.c_str(); // 写入数据到共享内存 if (pShareM->lock()) { // 锁定共享内存以确保数据安全写入 memcpy(pShareM->data(), p, sstr.length()); // 复制数据到共享内存 pShareM->unlock(); // 解锁共享内存 qDebug() << "Data written to shared memory"; // 输出写入数据成功的调试信息 } else { qDebug() << "Failed to lock shared memory for writing"; // 锁定共享内存失败时输出调试信息 } }
代码存放路径
运行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。