thinkvd dvd and video converter

thinkvd dvd and video converter

分配大块内存与list列表buffer关联的思考

在wince下某软件工程中的数据流动流程大致如下,从采集到的数据,然后组包、滤波、已滤波包-->(分发)
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中获取数据即可.
以上只是一个应用的初步想法,仅供参考


阅读更多
个人分类: C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭