您的位置:首页 > 编程语言 > Qt开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: