利用Event和MapFile进程共享信息
生活随笔
收集整理的這篇文章主要介紹了
利用Event和MapFile进程共享信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
工作過程:
進程一, 建立映射文件,填寫數據,并發出Event的信號;
進程二,打開映射文件,收到Event的信號時讀取數據.
#include?<windows.h>
#include?<string.h>
#include?<iostream>
using?namespace?std;
#define?FILE_SIZE?1024
static?HANDLE?hMapFile;
static?LPVOID?lpMapAddress;
static?LPCTSTR?g_szEventName="EventName";
void?Write(char*?data){
????if(lpMapAddress!=NULL){
????????memset(lpMapAddress,0,FILE_SIZE);
????????sprintf((char*)lpMapAddress,"%s",data);
????}
}
void?Read(){
????if(lpMapAddress!=NULL){
????????printf("%s\n",lpMapAddress);
????}
}
void?Process1(){//寫數據
hMapFile?=?CreateFileMapping(
????INVALID_HANDLE_VALUE,???????????????//?Current?file?handle.?
????NULL,??????????????????????????????//?Default?security.?
????PAGE_READWRITE,????????????????????//?Read/write?permission.?
????0,?????????????????????????????????//?Max.?object?size.?
????FILE_SIZE,?????????????????????????//?Size?of?hFile.?
????"MyFileMappingObject");????????????//?Name?of?mapping?object.?
?
if?(hMapFile?==?NULL)?
{?
????printf("Could?not?create?file-mapping?object.");?
????return?;
}?
//
lpMapAddress?=?MapViewOfFile(hMapFile,?//?Handle?to?mapping?object.?
????FILE_MAP_ALL_ACCESS,???????????????//?Read/write?permission?
????0,?????????????????????????????????//?Max.?object?size.?
????0,?????????????????????????????????//?Size?of?hFile.?
????FILE_SIZE);????????????????????????????????//?Map?entire?file.?
?
if?(lpMapAddress?==?NULL)?
{?
????printf("Could?not?map?view?of?file.");?
????return?;
}?
::Sleep(10000);
//Write?data
HANDLE?hEvent=::OpenEvent(
????????EVENT_MODIFY_STATE,
????????FALSE,
????????g_szEventName);
while(hEvent!=NULL){
????????scanf("%s",lpMapAddress);
????????::SetEvent(hEvent);
}
::CloseHandle(hEvent);
hEvent=INVALID_HANDLE_VALUE;
}
void?Process2(){//讀數據
hMapFile?=?OpenFileMapping(FILE_MAP_ALL_ACCESS,?//?Read/write?permission.?
????FALSE,?????????????????????????????//?Do?not?inherit?the?name
????"MyFileMappingObject");????????????//?of?the?mapping?object.?
?
if?(hMapFile?==?NULL)?
{?
????printf("Could?not?open?file-mapping?object.\n");?
????return;
}?
?
lpMapAddress?=?MapViewOfFile(hMapFile,?//?Handle?to?mapping?object.?
????FILE_MAP_ALL_ACCESS,???????????????//?Read/write?permission.?
????0,?????????????????????????????????//?Max.?object?size.?
????0,????????????????????????????????????//?Size?of?hFile.?
????FILE_SIZE);????????????????????????????????//?Map?entire?file.?
?
if?(lpMapAddress?==?NULL)?
{?
????printf("Could?not?map?view?of?file.\n");?
????return;
}?
//Wait?for?data
HANDLE?hEvent=::CreateEvent(
????????NULL,
????????TRUE,
????????FALSE,
????????g_szEventName);
while(hEvent!=NULL){
????????::WaitForSingleObject(hEvent,INFINITE);
????????::ResetEvent(hEvent);
????????::Read();
????}
::CloseHandle(hEvent);
hEvent=INVALID_HANDLE_VALUE;
}
void?main(){
????int?flag;
????cin>>flag;
????if(flag==1){
????????Process1();
????}
????else?if(flag==2){
????????Process2();
????}
}
進程一, 建立映射文件,填寫數據,并發出Event的信號;
進程二,打開映射文件,收到Event的信號時讀取數據.
#include?<windows.h>
#include?<string.h>
#include?<iostream>
using?namespace?std;
#define?FILE_SIZE?1024
static?HANDLE?hMapFile;
static?LPVOID?lpMapAddress;
static?LPCTSTR?g_szEventName="EventName";
void?Write(char*?data){
????if(lpMapAddress!=NULL){
????????memset(lpMapAddress,0,FILE_SIZE);
????????sprintf((char*)lpMapAddress,"%s",data);
????}
}
void?Read(){
????if(lpMapAddress!=NULL){
????????printf("%s\n",lpMapAddress);
????}
}
void?Process1(){//寫數據
hMapFile?=?CreateFileMapping(
????INVALID_HANDLE_VALUE,???????????????//?Current?file?handle.?
????NULL,??????????????????????????????//?Default?security.?
????PAGE_READWRITE,????????????????????//?Read/write?permission.?
????0,?????????????????????????????????//?Max.?object?size.?
????FILE_SIZE,?????????????????????????//?Size?of?hFile.?
????"MyFileMappingObject");????????????//?Name?of?mapping?object.?
?
if?(hMapFile?==?NULL)?
{?
????printf("Could?not?create?file-mapping?object.");?
????return?;
}?
//
lpMapAddress?=?MapViewOfFile(hMapFile,?//?Handle?to?mapping?object.?
????FILE_MAP_ALL_ACCESS,???????????????//?Read/write?permission?
????0,?????????????????????????????????//?Max.?object?size.?
????0,?????????????????????????????????//?Size?of?hFile.?
????FILE_SIZE);????????????????????????????????//?Map?entire?file.?
?
if?(lpMapAddress?==?NULL)?
{?
????printf("Could?not?map?view?of?file.");?
????return?;
}?
::Sleep(10000);
//Write?data
HANDLE?hEvent=::OpenEvent(
????????EVENT_MODIFY_STATE,
????????FALSE,
????????g_szEventName);
while(hEvent!=NULL){
????????scanf("%s",lpMapAddress);
????????::SetEvent(hEvent);
}
::CloseHandle(hEvent);
hEvent=INVALID_HANDLE_VALUE;
}
void?Process2(){//讀數據
hMapFile?=?OpenFileMapping(FILE_MAP_ALL_ACCESS,?//?Read/write?permission.?
????FALSE,?????????????????????????????//?Do?not?inherit?the?name
????"MyFileMappingObject");????????????//?of?the?mapping?object.?
?
if?(hMapFile?==?NULL)?
{?
????printf("Could?not?open?file-mapping?object.\n");?
????return;
}?
?
lpMapAddress?=?MapViewOfFile(hMapFile,?//?Handle?to?mapping?object.?
????FILE_MAP_ALL_ACCESS,???????????????//?Read/write?permission.?
????0,?????????????????????????????????//?Max.?object?size.?
????0,????????????????????????????????????//?Size?of?hFile.?
????FILE_SIZE);????????????????????????????????//?Map?entire?file.?
?
if?(lpMapAddress?==?NULL)?
{?
????printf("Could?not?map?view?of?file.\n");?
????return;
}?
//Wait?for?data
HANDLE?hEvent=::CreateEvent(
????????NULL,
????????TRUE,
????????FALSE,
????????g_szEventName);
while(hEvent!=NULL){
????????::WaitForSingleObject(hEvent,INFINITE);
????????::ResetEvent(hEvent);
????????::Read();
????}
::CloseHandle(hEvent);
hEvent=INVALID_HANDLE_VALUE;
}
void?main(){
????int?flag;
????cin>>flag;
????if(flag==1){
????????Process1();
????}
????else?if(flag==2){
????????Process2();
????}
}
轉載于:https://www.cnblogs.com/thomas/archive/2005/04/03/131303.html
總結
以上是生活随笔為你收集整理的利用Event和MapFile进程共享信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用ADO.NET 的最佳实践(zz)
- 下一篇: 超短个性签名四个字