进程间的数据共享

//========================================================================
//TITLE:
//    进程间的数据共享
//AUTHOR:
//    norains
//DATE:
//    Friday  20-June-2008
//Environment:
//    WINCE5.0 + VS2005 + MIPS SDK
//========================================================================

    同一进程的不同线程间共享数据不是难事,并且方式也很多,不胜枚举;而不同的进程间需要共享数据,虽然方法不多,但却也颇有成效。
   
    其实不同进程间的数据共享很简单,只需要调用CreateFileMapping和MapViewOfFile即可。CreateFileMapping创建或获取一个内存文件句柄,而MapViewOfFile则是获取文件句柄的存储内存的起始地址。
   
    假设有两个程序,程序A负责设置数据,程序B负责读取,则简单的程序例子可以如下:
   
    程序A:

#include "windows.h"
#include "vector"

#define MEM_SIZE 0x1000000
#define MEM_SHARE_NAME TEXT("bobo")

int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
{
  //创建或获取内存文件句柄
 HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
 VOID * pMem = NULL;
 if(hFile != NULL)
 {
  //获取存储的内存地址
  pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);

  //设置数据
  std::vector<char> vtStr;
  vtStr.push_back(&apos;T&apos;);
  vtStr.push_back(&apos;E&apos;);
  vtStr.push_back(&apos;S&apos;);
  vtStr.push_back(&apos;T&apos;);
  vtStr.push_back(0);
  
  memcpy(pMem,&vtStr[0],vtStr.size());
 }

 //如果不再使用,应该关闭句柄
 //CloseHandle(hFile);
 
 return 0;
}


    程序B:

#include "windows.h"
#include "vector"

#define MEM_SIZE 0x1000000
#define MEM_SHARE_NAME TEXT("bobo")

int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
{
 HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
 VOID * pMem = NULL;
 if(hFile != NULL)
 {
  pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);

  //读取数据
  std::vector<char> vtStr(6,0);
  memcpy(&vtStr[0],pMem,vtStr.size());
 }

 //如果不再使用,应该关闭句柄
 //CloseHandle(hFile);
 
 return 0;
}


    这两个程序片段很简单,为了说明方便,并没有用到信号量同步。两个程序间之所以能够读取相同的内存地址,主要是调用CreateFileMapping函数时的尾参数都是一致的,因此获取的内存文件句柄都是指向同一个,最后根据该句柄获取的内存存储地址才是一致,故达到了不同进程间共享数据的目的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt共享内存是一种实现进程通信的机制。进程通信通常用于在不同的进程交换数据共享内存就是将一块内存空映射到多个进程的地址空中,使得多个进程可以直接访问这块内存空。Qt提供了QSharedMemory类来实现共享内存。 使用Qt共享内存进行进程通信的步骤如下: 1. 创建一个QSharedMemory对象,并指定共享内存的唯一标识符。 2. 调用create()函数来创建共享内存,如果共享内存已经存在,则直接打开。 3. 调用attach()函数将共享内存映射到当前进程的地址空中。 4. 使用writeData()函数向共享内存中写入数据。 5. 使用readData()函数从共享内存中读取数据。 6. 使用detach()函数将共享内存从当前进程的地址空中解除映射。 7. 使用destroy()函数销毁共享内存。 通过这种方式,多个进程可以通过共享内存来交换数据,而无需通过消息传递等方式进行繁琐的数据传输。这样可以提高进程通信的效率,减少系统资源的占用。 需要注意的是,共享内存的使用需要保证互斥性,避免多个进程同时对共享内存进行写操作导致数据混乱。可以使用QMutex等同步机制来解决这个问题。 总之,Qt共享内存提供了一种高效的进程通信方式,使得多个进程可以方便地进行数据交换。可以广泛应用于需要实现进程数据共享的场景,如多进程协同处理、进程数据传递等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值