写入
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//"memory"是共享内存块的键值(标识),所以必须一致
share=new QSharedMemory("memory");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_spinBox_valueChanged(int arg1)
{
QString dataStr=QString::number(arg1);
int size = dataStr.size();
//create用法类似new,用来开辟内存空间
share->create(size,QSharedMemory::ReadWrite);
//lock/unlock用法类似线程锁,用来确保数据正确性
share->lock();
char*dataShare= (char*)share->data();
memcpy(dataShare,dataStr.toStdString().c_str(),size);
share->unlock();
}
读取
#include <string>
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_Timer=new QTimer;
m_Timer->start(10);
connect(m_Timer,SIGNAL(timeout()),this,SLOT(slot_QTimer_TimeOut()));
//"memory"是共享内存块的键值(标识),所以必须一致
share=new QSharedMemory("memory");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slot_QTimer_TimeOut()
{
if(!share->attach(QSharedMemory::ReadOnly)){ return;}
share->lock();
char*c=(char*)share->constData();
string str = c;
QString qstr = QString::fromStdString(str);
ui->lineEdit->setText(qstr);
//detach类似于delete,如果写入完成就直接detach,读取端就会attach失败
share->detach();
share->unlock();
}