首页 > 利用Event和MapFile进程共享信息

利用Event和MapFile进程共享信息

工作过程:





进程一, 建立映射文件,填写数据,并发出Event的信号;





进程二,打开映射文件,收到Event的信号时读取数据.



None.gif#include <windows.h>

None.gif#include 
<string.h>

None.gif#include 
<iostream>

None.gif
using namespace std;

None.gif

None.gif
#define FILE_SIZE 1024

None.gif

None.gif
static HANDLE hMapFile;

None.gif
static LPVOID lpMapAddress;

None.gif
static LPCTSTR g_szEventName="EventName";

None.gif

ExpandedBlockStart.gifContractedBlock.gif
void Write(char* data)dot.gif{

ExpandedSubBlockStart.gifContractedSubBlock.gif    
if(lpMapAddress!=NULL)dot.gif{

InBlock.gif        memset(lpMapAddress,
0,FILE_SIZE);

InBlock.gif        sprintf((
char*)lpMapAddress,"%s",data);

ExpandedSubBlockEnd.gif    }


ExpandedBlockEnd.gif}


None.gif

ExpandedBlockStart.gifContractedBlock.gif
void Read()dot.gif{

ExpandedSubBlockStart.gifContractedSubBlock.gif    
if(lpMapAddress!=NULL)dot.gif{

InBlock.gif        printf(
"%s ",lpMapAddress);

ExpandedSubBlockEnd.gif    }


ExpandedBlockEnd.gif}


None.gif

None.gif

ExpandedBlockStart.gifContractedBlock.gif
void Process1()dot.gif{ //写数据

InBlock.gif
hMapFile = CreateFileMapping(

InBlock.gif    INVALID_HANDLE_VALUE,               
// Current file handle. 

InBlock.gif
    NULL,                              // Default security. 

InBlock.gif
    PAGE_READWRITE,                    // Read/write permission. 

InBlock.gif
    0,                                 // Max. object size. 

InBlock.gif
    FILE_SIZE,                         // Size of hFile. 

InBlock.gif
    "MyFileMappingObject");            // Name of mapping object. 

InBlock.gif
 

InBlock.gif
if (hMapFile == NULL) 

ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif

InBlock.gif    printf(
"Could not create file-mapping object."); 

InBlock.gif    
return ;

ExpandedSubBlockEnd.gif}
 

InBlock.gif

InBlock.gif
//

InBlock.gif
lpMapAddress = MapViewOfFile(hMapFile, // Handle to mapping object. 

InBlock.gif
    FILE_MAP_ALL_ACCESS,               // Read/write permission 

InBlock.gif
    0,                                 // Max. object size. 

InBlock.gif
    0,                                 // Size of hFile. 

InBlock.gif
    FILE_SIZE);                                // Map entire file. 

InBlock.gif
 

InBlock.gif
if (lpMapAddress == NULL) 

ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif

InBlock.gif    printf(
"Could not map view of file."); 

InBlock.gif    
return ;

ExpandedSubBlockEnd.gif}
 

InBlock.gif::Sleep(
10000);

InBlock.gif
//Write data

InBlock.gif
HANDLE hEvent=::OpenEvent(

InBlock.gif        EVENT_MODIFY_STATE,

InBlock.gif        FALSE,

InBlock.gif        g_szEventName);

InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif
while(hEvent!=NULL)dot.gif{

InBlock.gif        scanf(
"%s",lpMapAddress);

InBlock.gif        ::SetEvent(hEvent);

ExpandedSubBlockEnd.gif}


InBlock.gif::CloseHandle(hEvent);

InBlock.gifhEvent
=INVALID_HANDLE_VALUE;

InBlock.gif

ExpandedBlockEnd.gif}


None.gif

ExpandedBlockStart.gifContractedBlock.gif
void Process2()dot.gif{ //读数据

InBlock.gif
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, // Read/write permission. 

InBlock.gif
    FALSE,                             // Do not inherit the name

InBlock.gif
    "MyFileMappingObject");            // of the mapping object. 

InBlock.gif
 

InBlock.gif
if (hMapFile == NULL) 

ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif

InBlock.gif    printf(
"Could not open file-mapping object. "); 

InBlock.gif    
return;

ExpandedSubBlockEnd.gif}
 

InBlock.gif 

InBlock.giflpMapAddress 
= MapViewOfFile(hMapFile, // Handle to mapping object. 

InBlock.gif
    FILE_MAP_ALL_ACCESS,               // Read/write permission. 

InBlock.gif
    0,                                 // Max. object size. 

InBlock.gif
    0,                                    // Size of hFile. 

InBlock.gif
    FILE_SIZE);                                // Map entire file. 

InBlock.gif
 

InBlock.gif
if (lpMapAddress == NULL) 

ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif

InBlock.gif    printf(
"Could not map view of file. "); 

InBlock.gif    
return;

ExpandedSubBlockEnd.gif}
 

InBlock.gif

InBlock.gif
//Wait for data

InBlock.gif
HANDLE hEvent=::CreateEvent(

InBlock.gif        NULL,

InBlock.gif        TRUE,

InBlock.gif        FALSE,

InBlock.gif        g_szEventName);

InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif
while(hEvent!=NULL)dot.gif{

InBlock.gif        ::WaitForSingleObject(hEvent,INFINITE);

InBlock.gif        ::ResetEvent(hEvent);

InBlock.gif        ::Read();

ExpandedSubBlockEnd.gif    }


InBlock.gif::CloseHandle(hEvent);

InBlock.gifhEvent
=INVALID_HANDLE_VALUE;

ExpandedBlockEnd.gif}


None.gif

ExpandedBlockStart.gifContractedBlock.gif
void main()dot.gif{

InBlock.gif    
int flag;

InBlock.gif    cin
>>flag;

ExpandedSubBlockStart.gifContractedSubBlock.gif    
if(flag==1)dot.gif{

InBlock.gif        Process1();

ExpandedSubBlockEnd.gif    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    
else if(flag==2)dot.gif{

InBlock.gif        Process2();

ExpandedSubBlockEnd.gif    }


ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/thomas/archive/2005/04/03/131303.html

更多相关:

  • 在使用空时,习惯这么赋值  int *p = NULL;  编译器进行解释程序时,NULL会被直接解释成0,所以这里的参数根本就不是大家所想的NULL,参数已经被编译器偷偷换成了0,0是整数。  因此这面的问题就尴尬了 不好意思图片引用于网络中。 为啥呢不是this is the ptr function…这个。这就是C++中的...

  • var d= {a: 1,b: null,c: 3,d: undefined };Object.keys(d).forEach(k=>d[k]==null&&delete d[k]);//去掉值为null或undefined的对象属性//Object.keys(d).forEach(k=>(d[k]==null||d[k]==='')...

  • //ES6获取浏览器url跟参 public getUrlParam = a => (a = location.search.substr(1).match(new RegExp(`(^|&)${a}=([^&]*)(&|$)`)),a?a[2]:null);...

  • 文章目录1. 解决问题2. 应用场景3. 实现如下C++实现C语言实现4. 缺点 1. 解决问题 在简单工厂模式中,我们使用卖衣服进行举例,同一种工厂可以卖很多不同种类的衣服,工厂只是将衣服的生产过程进行了封装。 当我们增加衣服种类的时候,在简单工厂模式中需要修改工厂的代码,破坏了类的开闭原则(对扩展开发, 对修改关闭),...

  • 在服务端数据库的处理当中,涉及中文字符的结构体字段,需要转为Utf8后再存储到表项中。从数据库中取出包含中文字符的字段后,如果需要保存到char *类型的结构体成员中,需要转为Ansi后再保存。从数据库中取出类型数字的字段后,如果需要保存到int型的结构体成员中,需要调用atoi函数进行处理后再保存。 1 static char *...