首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

用内存储器映射文件实现应用程序只运行一个实例

2012-11-07 
用内存映射文件实现应用程序只运行一个实例原理:如果一个应用程序的实例已经运行,那么当再运行一个实例时,

用内存映射文件实现应用程序只运行一个实例

  原理:

         如果一个应用程序的实例已经运行,那么当再运行一个实例时,系统只会为这个实例创建一个新的内存映射视图,这个内存映射视图会被映射到第一个实例所映射的虚拟内存中,这样就可以在多个实例之间共享内存中的代码和数据,可以通过数据来控制运行实例的个数即可。当然,要实现多个实例的数据共享,不是简单的使用全局变量就行了,应用程序的文件映像会被分到不同的段中:

    READ:可读数据段

    WRITE:可写数据段

    EXECUTE:可执行数据段

    SHARED:该段的内容会被多个实例共享

   编译器在默认情况下,数据都不会被放到SHARED中,要想把数据发到该段中,需要特别告诉给编译器,用2种方法:

方式1 #pragma data_seg("Shared")
   int g_iAppInstance=1;
   #pragma data_seg()
 

   #pragma data_seg("name"),当编译器执行到这句时,会将其之下出现的已经初始化的变量放到shared段中

   #pragma data_seg(),表示恢复默认

方式2

#pragma data_seg("Shared")

__declspec(allocate("Shared")) int  g_iAppInstance;
 #pragma data_seg()

这个和方式1的区别是不需要初始化

 

除此之外,还要告诉连接器要共享这些变量:
#pragma comment(linker,"/SECTION:Shared,RWS")

 

示例代码如下:

  

#include <iostream>using namespace std;//1#pragma data_seg("Shared")int g_iAppInstance=1;#pragma data_seg()

 

//2// #pragma data_seg("Shared")// __declspec(allocate("Shared")) int g_iAppInstance;// #pragma data_seg()

 

#pragma comment(linker,"/SECTION:Shared,RWS")

void main(){ if(g_iAppInstance==1) {  g_iAppInstance++;  cout<<"I am running.\n";  system("pause"); } else {  exit(1); } g_iAppInstance--;}

 

 

热点排行