示例:
#include <windows.h>
#include <iostream>
using namespace std;
int main(void)
{
HANDLE hFileMap;
HANDLE hEvent;
hEvent = CreateEvent(NULL, false, false, TEXT("MyEvent"));//开辟事件
if (hEvent == NULL)
{
printf("createEvent failed\n");
return 0;
}
hFileMap = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0,1024, TEXT("MyShareData"));//创造名为MyShareData的映射空间
if (hFileMap == NULL)
{
printf("createfilemapping failed\n");
return 0;
}
//float *pcMap为浮点型的指针
float *pcMap = (float *)MapViewOfFile(hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//创造映射空间的指针,
if (pcMap == NULL)
{
printf("MapViewOfFile failed\n");
CloseHandle(hFileMap);
return 0;
}
for (int i = 0; i < 10;i++)
{
pcMap[i] = i;//通过指针向内存空间赋值
}
UnmapViewOfFile(pcMap);//删除映射内存
CloseHandle(hFileMap);
SetEvent(hEvent);//设置无信号状态
CloseHandle(hEvent);//关闭句柄值
return 1;
}
方法一 不太管用
#include <windows.h>
#include <iostream>
using namespace std;
int main(void)
{
HANDLE hMySharedMapFile = OpenFileMapping(FILE_MAP_WRITE|FILE_MAP_READ, false, TEXT("MyShareData"));//以读和写的方式打开名为MyShareData的映射空间
float* pcMap;
pcMap = (float*)MapViewOfFile(hMySharedMapFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//创建映射空间的指针
//读取映射时需要先有映射空间,否则内存读取失败
for (int i = 0; i < 10; i++)
{
cout << pcMap[i] << endl;//输出,显示
}
pcMap[1] = 3;
UnmapViewOfFile(pcMap);//删除映射空间
CloseHandle(hMySharedMapFile);//关闭映射空间句柄
return 1;
}
方法二:还是需要重新创建事件,开辟映射空间,创建指针,输出
HANDLE hFileMap;
HANDLE hEvent;
int processValue=0;
int* pcMap;//指针的新建最好放外面,要么会一直新建空间进行存储
while (true)
{
hEvent = CreateEvent(NULL, false, false, TEXT("MyEvent"));//开辟事件
if (hEvent == NULL)
{
printf("createEvent failed\n");
continue;
}
hFileMap = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, TEXT("MyShareData"));//创造名为MyShareData的映射空间
if (hFileMap == NULL)
{
continue;
}
pcMap = (int*)MapViewOfFile(hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//创建映射空间的指针
processValue = pcMap[0];
ui->progressBar->setValue(processValue);
if (processValue == 100)
{
*pcMap = 0;//一定要将指针置零,否则该指针指向上次程序运行结果的的内存
UnmapViewOfFile(pcMap);//删除映射空间
CloseHandle(hFileMap);//关闭映射空间句柄* /
CloseHandle(hEvent);//关闭映射空间句柄* /
QMessageBox::information(this, QString::fromLocal8Bit("提示窗口"), QString::fromLocal8Bit("计算结束 "));
break;
}
}