Qt进程间通信——共享内存
2015-08-04 19:37
393 查看
Qt提供了一种安全的共享内存的实现QSharedMemory,以便在多线程和多进程编程中安全的使用。比如说QQ的聊天的客户端,这里有个个性头象,当点击QQ音乐播放器的时候,QQ音乐播放器里也有一个个性头像,这两者间的头像一样,可以用共享内存的方法实现。qt实现共享内存的步骤如下:
1)向共享内存中提供数据的一方:
1. 定义QSharedMemory shareMemory,并设置标志名shareMemory.setKey();
2. 将共享内存与主进程分离 shareMemory.detach();
3. 创建共享内存 shareMemory.create();
4. 将共享内存上锁shareMemory.lock();
5. 将进程中要共享的数据拷贝到共享内存中;
6. 将共享内存解锁shareMemory.unlock();
2)从共享内存中取数据的一方:
1. 定义QSharedMemory
shareMemory,并设置与数据提供方一样的标志名shareMemory.setKey();
2. 将共享内存上锁shareMemory.lock();
3. 将共享内存与主进程绑定shareMemory.attach(),使该进程可以访问共享内存的数据;
4. 从共享内存中取数据;
5. 使用完后将共享内存解锁shareMemory.unlock(),另外将共享内存与该进程分离shareMemory.detach();
现构建两个qt工程,一个提供数据,一个读取数据后进行对应的操作。主要代码如下:
A 向共享内存中提供数据的一方
B 从共享内存中取数据的一方
参考:/article/11015460.html
1)向共享内存中提供数据的一方:
1. 定义QSharedMemory shareMemory,并设置标志名shareMemory.setKey();
2. 将共享内存与主进程分离 shareMemory.detach();
3. 创建共享内存 shareMemory.create();
4. 将共享内存上锁shareMemory.lock();
5. 将进程中要共享的数据拷贝到共享内存中;
6. 将共享内存解锁shareMemory.unlock();
2)从共享内存中取数据的一方:
1. 定义QSharedMemory
shareMemory,并设置与数据提供方一样的标志名shareMemory.setKey();
2. 将共享内存上锁shareMemory.lock();
3. 将共享内存与主进程绑定shareMemory.attach(),使该进程可以访问共享内存的数据;
4. 从共享内存中取数据;
5. 使用完后将共享内存解锁shareMemory.unlock(),另外将共享内存与该进程分离shareMemory.detach();
现构建两个qt工程,一个提供数据,一个读取数据后进行对应的操作。主要代码如下:
A 向共享内存中提供数据的一方
void MainWindow::sharedMemoryCreat() { sharedMemory.setKey("BootAnimation"); if(sharedMemory.isAttached()) { sharedMemory.detach();//将该进程与共享内存段分离 } const char *from = "AnimationEnd"; int size = strlen(from) + 1; if(!sharedMemory.create(size)) { qDebug()<<tr("can't create memory segment"); qDebug()<<sharedMemory.error(); } sharedMemory.lock(); char *to = (char*)sharedMemory.data(); qDebug()<<"size of written:"<<size; memcpy(to,from,qMin(size,sharedMemory.size()));//数据从该进程中拷贝到共享数据内存中 sharedMemory.unlock();//共享内层解锁 }
B 从共享内存中取数据的一方
int Widget::readShareMem() { sharedMemory.setKey("BootAnimation"); if(!sharedMemory.attach())//将sharedMemory与该进程绑定使之可以访问sharedMemory里的内容 { qDebug()<<tr("can't attach share memory"); } sharedMemory.lock();//给sharedMemory加锁 qDebug()<<"size of readed:"<<sharedMemory.size(); memContent = QString::fromLocal8Bit((char*)sharedMemory.data()); sharedMemory.unlock();//将sharedMemory解锁 sharedMemory.detach();//将shareMemeory与该进程分离 return 0; }
</pre><pre>
int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); while(1) { //qDebug()<< w.memContent; w.readShareMem(); if(0 == w.memContent.compare("AnimationEnd")) { qDebug("Tekapp is running, turn off animation display !!!"); exit(0); } QThread::sleep(1); //这个必须要加上,否则CPU没空去干其他的事情,在多进程的情况下会影响其他程序的启动、响应速度 QCoreApplication::processEvents(); // use this to process events without an event loop } return a.exec(); // in fact here it's no use, event loop can not enter }
参考:/article/11015460.html
相关文章推荐
- 如何让Qt 的程序等待一段时间
- Qt的事件模型(5种使用办法,通常重新实现event handler即可。只有定义控件才需要管理信号的发射)
- Win7使用Visual Studio 2010编译用于Qt4.8.6的MySQL驱动
- 使QTableWidget 增加自动添加行,单击删除行的功能.
- QTableView修改数据后弹出是否保存的提示框。
- [PyQt] 在QLabel上用drawText实现文字滚动
- error MSB6006: "cmd.exe" exited with code 255
- 【Qt OpenGL教程】12:显示列表
- ubuntu+qt5.5安装完错误
- Qt5 自创简单音乐视频播放器(基础版)
- Qt信号与槽机制(signal & slot)
- Qt自定义委托在QTableView中绘制控件、图片、文字
- QT实现类似QQ截图功能(二):画箭头
- VS2010+Qt5.3.1+qt-vs-addin插件
- Qt 常用类 (17)—— QLineEdit
- Qt 常用类 (16)—— QRadioButton
- Qt 常用类(15)—— QCheckBox
- Qt 常用类(14)—— QPushButton
- Qt 常有类 (13)—— QAbstractButton
- Qt 常用类 (12)—— QLabel