- 最近工作上有用到进程通信相关的內容,今天来总结一下,看了网上的大部分内容介绍大体上是通过共享内存来实现,主要是通过QSharedMemory类来访问共享内存,实现共享内存的操作,但是这有个不好的地方就是,当两个进程都detach共享内存时,这个内存就会被回收掉,没法实现类似延时读取的功能。在此,我们可以利用QFile的map函数来进程内存映射文件,其本质上也是模拟共享内存。然后进程间同步呢主要是通过QSystemSemaphore类这个系统级信号量来实现。
- 涉及到的相关接口
uchar * QFileDevice::map(qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)
offset是映射起始的偏移量,size是映射的内存大小,flags暂时不用
bool QFileDevice::unmap(uchar * address)
回收映射的内存,这里有一个需要注意的是当这个内存映射的文件对象被销毁或者重新打开一个新的文件时,相关的没有回收映射的内存会被自动回收
QSystemSemaphore g_sem("SemRead", 1, QSystemSemaphore::Create);
QtParentTask::QtParentTask(QWidget *parent)
: QWidget(parent),ui(new Ui::QtParentTaskClass)
,m_timer(new QTimer(this))
,m_fp(nullptr)
{
ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, &QtParentTask::startChildProcess);
connect(m_timer, &QTimer::timeout, this, &QtParentTask::readChildData);
QDir dir;
QString dirpath = QDir::tempPath() + "\\QtIPC_test";
if (!dir.exists(dirpath))
dir.mkdir(dirpath);
ui->progressBar->setMaximum(100000);
m_memFile.