我的程序是这样的,有一个线程A负责每10秒钟采集一组数据,线程B和线程C读取采集到的数据后分别负责网络传输和存入数据库。我想采用共享内存的方式处理。struct DATA
{
WORD val[100];
};
CEvent beginEvent; //建立自动事件对象,初始为未发信状态// 线程A 中建立消息队列,将值写入共享内存块中UINT Thread_A(LPVOID lpVal)
{
//建立共享内存
DATA *data=NULL;
HANDLE hFileMapping;
hFileMapping=::CreateFileMapping(0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(DATA),"Share");
data=(DATA *)MapViewOfFile(hFileMapping,FILE_MAP_ALL_ACCESS,0,0,0);
...
//消息队列
int nTimerID=SetTimer(NULL,1,10000,NULL);
while (1)
{
if(GetMessage(&msg,NULL,NULL,NULL))
{
case WM_TIMER: //定时器消息 10秒触发一次
{
WORD dVal[100];
...
...
for (int i=0;i<100;i++)
{
data->val[i]=dVal[i]; //给共享内存 赋值
} beginEvent.SetEvent(); //设置事件为发信状态
}
break;
...
} } // while (bRun)
//放在这儿对吗?
UnmapViewOfFile(dataVal);
CloseHandle(hFile); return 0;
}//线程B和C也是每隔10钟就读取共享内存中的值,然后分别进行处理。B和C都要在线程A之后进行处理,所以用事件对象beginEvent进行同步UINT Thread_B(LPVOID lpVal)
{
...
//消息队列
int nTimerID=SetTimer(NULL,1,10000,NULL);
while (1)
{
if(GetMessage(&msg,NULL,NULL,NULL))
{
case WM_TIMER: //定时器消息 10秒触发一次
{
//等待事件对象beginEvent被激活
WaitForSingleObject(beginEvent,INFINITE); /////////读共享内存区,并赋值
HANDLE hFile;
hFile=OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,"Share");
DATA *dataVal=NULL;
dataVal=(DATA *)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0); WORD uData[100];
for (int j=0;j<100;j++)
{
uData[j]=dataVal->val[j];
} UnmapViewOfFile(dataVal);
CloseHandle(hFile);
...
...
}
}
}
return 0;
}//线程C略第一次使用共享内存的方法,有很多地方不是很清楚,我在A和B中,创建和解除共享内存分别放在了循环里和循环外,哪种方法是正确的?还有如果线程A、B、C同时启动,那像我这样用事件对象进行同步有什么问题没有?又或者我的程序在处理思路上是否有问题?请高手不吝赐教。
{
WORD val[100];
};
CEvent beginEvent; //建立自动事件对象,初始为未发信状态// 线程A 中建立消息队列,将值写入共享内存块中UINT Thread_A(LPVOID lpVal)
{
//建立共享内存
DATA *data=NULL;
HANDLE hFileMapping;
hFileMapping=::CreateFileMapping(0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(DATA),"Share");
data=(DATA *)MapViewOfFile(hFileMapping,FILE_MAP_ALL_ACCESS,0,0,0);
...
//消息队列
int nTimerID=SetTimer(NULL,1,10000,NULL);
while (1)
{
if(GetMessage(&msg,NULL,NULL,NULL))
{
case WM_TIMER: //定时器消息 10秒触发一次
{
WORD dVal[100];
...
...
for (int i=0;i<100;i++)
{
data->val[i]=dVal[i]; //给共享内存 赋值
} beginEvent.SetEvent(); //设置事件为发信状态
}
break;
...
} } // while (bRun)
//放在这儿对吗?
UnmapViewOfFile(dataVal);
CloseHandle(hFile); return 0;
}//线程B和C也是每隔10钟就读取共享内存中的值,然后分别进行处理。B和C都要在线程A之后进行处理,所以用事件对象beginEvent进行同步UINT Thread_B(LPVOID lpVal)
{
...
//消息队列
int nTimerID=SetTimer(NULL,1,10000,NULL);
while (1)
{
if(GetMessage(&msg,NULL,NULL,NULL))
{
case WM_TIMER: //定时器消息 10秒触发一次
{
//等待事件对象beginEvent被激活
WaitForSingleObject(beginEvent,INFINITE); /////////读共享内存区,并赋值
HANDLE hFile;
hFile=OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,"Share");
DATA *dataVal=NULL;
dataVal=(DATA *)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0); WORD uData[100];
for (int j=0;j<100;j++)
{
uData[j]=dataVal->val[j];
} UnmapViewOfFile(dataVal);
CloseHandle(hFile);
...
...
}
}
}
return 0;
}//线程C略第一次使用共享内存的方法,有很多地方不是很清楚,我在A和B中,创建和解除共享内存分别放在了循环里和循环外,哪种方法是正确的?还有如果线程A、B、C同时启动,那像我这样用事件对象进行同步有什么问题没有?又或者我的程序在处理思路上是否有问题?请高手不吝赐教。
解决方案 »
- CHtmlView GetHtmlDocument取不到全部内容..急~~~
- 问个简单的问题:看到很多函数的参数可以使用或运算(|)累加后传入。
- VC 串口 多线程 编程
- NAT穿透之我见。。。附带讨论问题。
- !!!!!!请教一个至今为止没有人给我一个建议的问题,太感谢了
- 请问那位大侠知道哪里有《深入浅出MFC》这本书下载!
- 请问,为什么有时候我调用recv函数一直不返回?
- 很急的问题
- 每次编译都把所有文件都编译一遍,没改动的也一样,怎么办?
- 请问如何发行RELEASE版,为什么无论我怎么设置都是DEBUG版啊,应该在RELEASE目录下的啊!
- 关于OnSelchangeCombo的问题!
- 获取cpu使用率,32位操作系统运行正常,到64位系统下就会调用失败,请教高人
{
WORD val[100];
}; 如果我在共享内存中数组的长度是不定长的,那么我该怎么定义结构体?可以在结构体中定义一个指针变量吗?
struct DATA
{
int nLen; //数据长度
LPWORD val; //指针
};
不需要用FileMapping, 就用一般的内存区就可以,注意用临界区保护就可。
另外,进程内的内存本身就是所有线程共享的,不需要FileMapping。使用时可以用同步对象来实现同步。