在C语言中,能够选用文件映射的办法,拓荒一段内存空间,各个进程和线程能够使用这段同享内存空间进行数据交换,也便是写读操作,这儿涉及到一个操控权限的问题,任何时间,只能答应一个线程或许进程对内存空间进行操作,看一段代码,是经过API完成的内存空间同享.
#defineFILE_SIZE1024
staticHANDLEhMapFile;
staticLPVOIDlpMapAddress;
staticLPCTSTRg_szEventName=”EventName”;
voidWrite(char*data){
if(lpMapAddress!=NULL){
MEMSet(lpMapAddress,0,FILE_SIZE);
sprintf((char*)lpMapAddress,”%s”,data);
}
}
voidRead(){
if(lpMapAddress!=NULL){
printf(“%sn”,lpMapAddress);
}
}
voidProcess1(){//写数据
hMapFile=CreateFileMapping(
INVALID_HANDLE_VALUE,//Currentfilehandle.
NULL,//Defaultsecurity.
PAGE_READWRITE,//Read/writepermission.
0,//Max.objectsize.
FILE_SIZE,//SizeofhFile.
”MyFileMappingObject”);//Nameofmappingobject.
if(hMapFile==NULL)
{
printf(“Couldnotcreatefile-mappingobject.”);
return;
}
//
lpMapAddress=MapViewOfFile(hMapFile,//Handletomappingobject.
FILE_MAP_ALL_ACCESS,//Read/writepermission
0,//Max.objectsize.
0,//SizeofhFile.
FILE_SIZE);//Mapentirefile.
if(lpMapAddress==NULL)
{
printf(“Couldnotmapviewoffile.”);
return;
}
::Sleep(10000);
//Writedata
ANDLEhEvent=::OpenEvent(
EVENT_MODIFY_STATE,
FALSE,
g_szEventName);
while(hEvent!=NULL){
scanf(“%s”,lpMapAddress);
::SetEvent(hEvent);
}
::CloseHandle(hEvent);
hEvent=INVALID_HANDLE_VALUE;
}
在Labview假如想动态请求内存只能经过DLL或许CIN来完成,LABVIEW自身又不支撑指针操作,完成十分困难,不过咱们能够经过数组来完成内存的分配.
同享内存同大局变量相同,相同存在数据竞赛的问题,咱们能够把同享内存看成是内存数据块大局变量.
LABVIEW中避免数据竞赛的最好办法是把读写操作在一个VI里,LABVIEW自身就会确保恣意时间只能有一个读写操作.
关于大局可读写变量,LABVIEW能够用内置大局变量也能够用FUNCTIONGLOBAL(我前面的文章中专门谈到了FUNCTIONGLOBAL和AE的概念,能够参照一下)
在自动化操控范畴,内存同享使用十分广泛,对CAN总线操控卡,有双口RAM的概念,对PLC有输入输出映射区,实际上指的都是固定的RAM空间,相关于计算机来说,便是一段内存空间.
了解PLC的朋友都十分清楚,PLC是选用循环扫描的办法来运转程序的,扫描开端前,一次性地读入外部开关的状况,存入输入映射区中,在一次扫描程序运转期间,它的状况是不变的.
咱们在LABVIEW规划操控程序时,也完全能够借用这个办法,实际上许多DSC和外部设备经过OPC通讯都是选用固定距离更新的办法.