使用内存文件在进程之间进行通信是个很好的方法,这里简单的展示一下,使用2个线程来模拟进程
主线程(生产者)先创建子线程(消费者),然后放入消息到内存文件中去,子线程一直检查直到发现主线程已经放入消息,它就取出来并显示出来。
#include <cstdio>
#include <iostream>
#include <vector>
#include <windows.h>
using namespace std;
DWORD WINAPI Reader(LPVOID param)
{
HANDLE map_file_handle;
LPVOID memory_map_file_address;
do
{//轮询,直到主线程把相关的信息放到内存文件
map_file_handle = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
FALSE,
TEXT("ShardObject"));
memory_map_file_address = MapViewOfFile(map_file_handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
} while (memory_map_file_address == NULL);
printf("Read message : %s\n", memory_map_file_address);
UnmapViewOfFile(memory_map_file_address);
CloseHandle(map_file_handle);
cout << "Sub Thread Finished" << endl;
return 0;
}
int main()
{
string str = "Tan Chuan Qi Tan Chuan Qi Tan Chuan Qi ";
DWORD thread_id;
HANDLE handle = CreateThread(
NULL,
0,
Reader,
NULL,
0,
&thread_id);
//主线程延迟放入消息,体现子线程(消费者)的轮询
Sleep(100);
HANDLE file_handle, map_file_handle;
LPVOID memory_map_file_address;
//create文件
file_handle = CreateFile(
L"c:\\temp.txt",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
//创建文件的内存映射文件。
map_file_handle=CreateFileMapping(
file_handle,
NULL,
PAGE_READWRITE,
0,
str.size(),
TEXT("ShardObject"));
memory_map_file_address = MapViewOfFile(map_file_handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
sprintf((char *)memory_map_file_address, str.c_str());
UnmapViewOfFile(memory_map_file_address);
WaitForSingleObject(handle, INFINITE);
CloseHandle(handle);
return 0;
}