1. 显示缓存、显示
2. 存储包、存储
3. 网络包、上传
4. 截屏
实际上要复杂些,这里只列举了主要的功能,工程中存在一个值得思考的问题,就是数据来回memory copy很频繁,IO开支不小。
因此希望分配一大块内存,它与list结构中的buffer关联,用队列方式来循环存储数据,不再过多的用memcpy,也可避免lock/unlock
主要测试代码实现如下:
二维数据内存分配:
char **darray_new(int row, int col, int size)
{
char **arr;
arr = (char **) malloc(sizeof(char *) * row + size * row * col);
TRACE(L"len = %d\n", sizeof(char *) * row + size * row * col);
if (arr != NULL)
{
char *head;
head = ((char *)arr + sizeof(char *) * row);
memset(arr, 0, sizeof(char *) * row + size * row * col);
while (row--){
arr[row] = head + size * row * col;
}
}
return arr;
}
void darray_free(char **arr)
{
if (arr != NULL)
free(arr);
}
#define ARRAY_ROW 5
#define ARRAY_COL 8 //与list个数相关
#define ARRAY_SIZE 4
struct ecgPack{
DWORD timestamp;
char **bufData;
};
list<ecgPack *> g_list;
char **g_arrayMem;
由于行业的特点,考虑到显示问题,ARRAY_ROW基本不变,实际应用中变化的是组包的个数list(用ARRAY_COL表示)
调用测试:
//包初始化
for(int i=0; i<ARRAY_COL; i++){
ecgPack *p = new ecgPack;
p->bufData = new char *[ARRAY_ROW];
g_list.push_back(p);
}
//内存分配
g_arrayMem = darray_new(ARRAY_ROW, ARRAY_COL, ARRAY_SIZE);
int j=0;
char c = 0x0A;
list<ecgPack *>::iterator itr = g_list.begin();
while(itr!=g_list.end()){
ecgPack *p = (*itr);
for(int i=0; i<ARRAY_ROW; i++){
p->bufData[i] = &g_arrayMem[i][0+ARRAY_SIZE*j]; //buffer之间的关联
p->bufData[i][0] = c; //测试数据
}
itr++;
j++;
c++;
}
//效果图,每一行代表的是波形显示数据,显示时只需要用知道当前数据移动的指针位置就可以, 避免数据在各个模块之间的流动,而是让各个模块在list中获取数据即可.
以上只是一个应用的初步想法,仅供参考