Qt共享内存(原创作者:zzwdkxx)

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工程,一个提供数据,一个读取数据后进行对应的操作。主要代码如下:

向共享内存中提供数据的一方

  1. void MainWindow::sharedMemoryCreat()  
  2. {  
  3.     sharedMemory.setKey("BootAnimation");  
  4.     if(sharedMemory.isAttached())  
  5.     {  
  6.         sharedMemory.detach();//将该进程与共享内存段分离  
  7.     }  
  8.   
  9.     const char *from = "AnimationEnd";  
  10.     int size = strlen(from) + 1;  
  11.   
  12.     if(!sharedMemory.create(size))  
  13.     {  
  14.         qDebug()<<tr("can't create memory segment");  
  15.         qDebug()<<sharedMemory.error();  
  16.     }  
  17.   
  18.     sharedMemory.lock();  
  19.     char *to = (char*)sharedMemory.data();  
  20.   
  21.     qDebug()<<"size of written:"<<size;  
  22.     memcpy(to,from,qMin(size,sharedMemory.size()));//数据从该进程中拷贝到共享数据内存中  
  23.     sharedMemory.unlock();//共享内层解锁  
  24. }  

从共享内存中取数据的一方

  1. int Widget::readShareMem()  
  2. {  
  3.     sharedMemory.setKey("BootAnimation");  
  4.       
  5.     if(!sharedMemory.attach())//将sharedMemory与该进程绑定使之可以访问sharedMemory里的内容  
  6.     {  
  7.         qDebug()<<tr("can't attach share memory");  
  8.     }  
  9.   
  10.     sharedMemory.lock();//给sharedMemory加锁  
  11.     qDebug()<<"size of readed:"<<sharedMemory.size();  
  12.     memContent = QString::fromLocal8Bit((char*)sharedMemory.data());  
  13.     sharedMemory.unlock();//将sharedMemory解锁  
  14.   
  15.     sharedMemory.detach();//将shareMemeory与该进程分离  
  16.   
  17.     return 0;  
  18. }  
  1. </pre><pre>  
  1. int main(int argc, char *argv[])  
  2. {  
  3.     QApplication a(argc, argv);  
  4.     Widget w;  
  5.     w.show();  
  6.   
  7.     while(1)  
  8.     {  
  9.         //qDebug()<< w.memContent;  
  10.         w.readShareMem();  
  11.         if(0 == w.memContent.compare("AnimationEnd"))  
  12.         {  
  13.             qDebug("Tekapp is running, turn off animation display !!!");  
  14.             exit(0);  
  15.         }  
  16.   
  17.         QThread::sleep(1); //这个必须要加上,否则CPU没空去干其他的事情,在多进程的情况下会影响其他程序的启动、响应速度  
  18.         QCoreApplication::processEvents();  // use this to process events without an event loop  
  19.     }  
  20.   
  21.     return a.exec();  // in fact here it's no use, event loop can not enter  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值