Qt进程间通信——共享内存
2015-10-31 11:24
453 查看
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 向共享内存中提供数据的一方
[cpp] view
plaincopy
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 从共享内存中取数据的一方
[cpp] view
plaincopy
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;
}
[cpp] view
plaincopy
</pre><pre>
[cpp] view
plaincopy
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
}
参考:http://blog.csdn.net/wangyeqiang/article/details/8296930
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 向共享内存中提供数据的一方
[cpp] view
plaincopy
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 从共享内存中取数据的一方
[cpp] view
plaincopy
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;
}
[cpp] view
plaincopy
</pre><pre>
[cpp] view
plaincopy
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
}
参考:http://blog.csdn.net/wangyeqiang/article/details/8296930
相关文章推荐
- QT状态机的使用
- qt中启动别的应用程序
- QT layout布局子部分大小问题
- qt下的时钟程序[0806]
- QT5的模块介绍【摘】
- Qt判断和打开进程(windows端),运行,检测,中止
- Qt标准输入输出问题
- 自学QT之QVideoWidget有声音无画面的解决办法
- 如何利用VS2010进行QT开发的环境配置(win10+VS2010+QT4.8.6)
- 关于Qt5 QtSerialPort串口通信
- Qt库&Qt Creator安装
- QT中的信号槽
- QT5入门之26 -QLabel
- Qt中开机启动画面
- QT快速读取数据量很大的Excel文件
- 学习Qt5(11)
- Qt :-1073741823 错误总结(备忘)
- Qt组合键(键盘与鼠标的组合)
- QTP写文本到txt文件的Sub过程Sub TestResultLog
- Qt中 QString 转 char*