• windows笔记使用内存映射文件在进程之间共享数据


      数据共享方法是通过让两个或多个进程映射同一个文件映射对象的视图来实现的,这意味着它们将共享物理存储器的同一个页面。因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中的数据变更情况。

    注意:如果多个进程共享单个文件映射对象,那么所有进程必须使用相同的名字来表示该文件映射对象。

     

    //------------------------------------------------------------

    // 文件名    : 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


     

  • 相关阅读:
    原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》
    FMX有一套自己的消息处理机制。类似这样:
    如何在 EXCEL 2003 插入的方框内打对勾,复选框
    微信朋友圈视频链接中的视频怎么下载到电脑?
    ie 8在打印网页的时候打印预览是空白的
    如何访问局域网的Access数据库?
    centos 7下载
    在评估一个性能测试工具的时候 我们一般要考虑哪些方向 ?
    外国人专门写了一篇文章,来分析为什么go在中国如此火
    python 编程测试练习答案
  • 原文地址:https://www.cnblogs.com/fangyukuan/p/1822310.html
Copyright © 2020-2023  润新知