数据共享方法是通过让两个或多个进程映射 同一个文件映射对象 的视图来实现的,这意味着它们将共享物理存储器的同一个页面。因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中的数据变更情况。
注意 :如果多个进程共享单个文件映射对象,那么所有进程 必须使用相同的名字 来表示该文件映射对象。
//------------------------------------------------------------
// 文件名 : 17_FileMapping_SharaData.cpp
// 创建者 : 方煜宽
// 邮箱 : fangyukuan@gmail.com
// 创建时间 : 2010-9-6 16:15
// 功能描述 : 使用内存映射文件在进程之间共享数据
// 请运行多个进程以观察进程之间共享数据的效果
// ------------------------------------------------------------
#include "stdafx.h"
#include "windows.h"
#include "process.h"
#include <iostream>
using namespace std ;
HANDLE g_hTimer = NULL ;
DWORD WINAPI Thead (void * pParam )
{
HANDLE hFileMapping = (HANDLE )pParam ;
int nIndex = 0;
while (true )
{
::WaitForSingleObject (g_hTimer , INFINITE );
void * pbFile = (void *)::MapViewOfFile (hFileMapping , FILE_MAP_WRITE , 0, 0, 0);
cout << nIndex ++ << " :" << (PBYTE )pbFile << endl ;
::UnmapViewOfFile (pbFile );
}
return 0;
}
int _tmain (int argc , _TCHAR * argv [])
{
HANDLE hFileMapping = ::CreateFileMapping (INVALID_HANDLE_VALUE ,
NULL ,
PAGE_READWRITE ,
0, 99,
TEXT ("kuan_FileMap" ));
void * pbFile = (void *)::MapViewOfFile (hFileMapping , FILE_MAP_WRITE , 0, 0, 0);
char szTemp [999] = {0};
cout << "input data:" ;
cin >> szTemp ;
memcpy (pbFile , szTemp , strlen (szTemp ));
::FlushViewOfFile (pbFile , 999);
// 下面是创建一个等待定时器
DWORD dwTheadID ;
HANDLE hThead = ::CreateThread (NULL , 0, Thead , hFileMapping , 0, &dwTheadID );
g_hTimer = ::CreateWaitableTimer (NULL , FALSE , NULL );
LARGE_INTEGER li ;
li .QuadPart = 0;
::SetWaitableTimer (g_hTimer , &li , 1000, NULL , NULL , FALSE );
::WaitForSingleObject (hThead , INFINITE );
::UnmapViewOfFile (pbFile );
::CloseHandle (hFileMapping );
::CloseHandle (hThead );
::CloseHandle (g_hTimer );
return 0;
}
看运行效果:先运行一个进程,输入数据。再打开另一个进程,输入数据,可以看到第一个进程的输出数据也改变了。
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822310.html