您的位置:首页 > 编程语言 > C语言/C++

[C++应用程序性能优化]动态数组——摄像机

2012-12-30 14:00 369 查看
CamBlock.h
#define MAX_LENGTH 1000
#define MAX_FRAMES 256

typedef struct _Frame
{
unsigned short idcamera;
unsigned long length;
unsigned short width;
unsigned short height;
unsigned char* data;
}Frame;

class CamBlock
{
public:
CamBlock(int id, unsigned long len, unsigned short numframes)
: _data(NULL), _length(0), _idcam(-1), _numframes(0)
{
if (len > MAX_LENGTH || numframes> MAX_FRAMES)
throw;
try
{
_frameindex = new Frame[numframes];
_data = new unsigned char[len];
}catch(...)
{
throw;
}
memset(_data, 0, len);
_length = len;
_idcam = id;
_numframes = numframes;
}
~CamBlock()
{
delete []_data;
delete []_frameindex;
}
bool SaveFrame(const Frame* frame);
bool ReadFrame(Frame* frame);
protected:
private:
Frame* _frameindex;
unsigned char* _data;
unsigned long _length;
int _idcam;
unsigned short _numframes;
unsigned long _framepos;
};

CameraArray.h
#define MAX_CAMERAS 256
#define MAX_INCREMENT 100
class CameraArray
{
typedef CamBlock* PtrBlock;
PtrBlock* camera_bufs;
unsigned short camera_num;
unsigned short max_num;
unsigned short inc_num;
public:
CameraArray(unsigned short max, unsigned short inc);
~CameraArray();
CamBlock* InsertBlock(unsigned short idcam, unsigned long size, unsigned short numframes);
bool RemoveBlock(unsigned short idcam);
private:
unsigned short GetPosition(unsigned short idcam);
};

CameraArray.cpp

#include "CameraArray.h"
CameraArray::CameraArray(unsigned short max, unsigned short inc)
: camera_bufs(NULL), max_num(0), inc_num(0), camera_num(0)
{
if (max > MAX_CAMERAS || inc > MAX_INCREMENT)
throw;
try
{
camera_bufs = new PtrBlock[max];
}catch(...)
{
throw;
}
max_num = max;
inc_num = inc;
}

CameraArray::~CameraArray()
{
for (unsigned short i = 0; i < camera_num; i++)
{
delete camera_bufs[i];
}
delete []camera_bufs;
}

CamBlock* CameraArray::InsertBlock(unsigned short idcam, unsigned long size, unsigned short numframes)
{
unsigned short pos = GetPosition(idcam);
if (camera_num == max_num)
{
PtrBlock* newbufs = NULL;
try{
newbufs = new PtrBlock[max_num + inc_num];
}catch(...){
throw;
}
memccpy(newbufs, camera_bufs, max_num*sizeof(PtrBlock));
delete []camera_bufs;
max_num += inc_num;
camera_bufs = newbufs;
}
if (pos != camera_num)
{
memmove(camera_bufs + pos + 1, camera_bufs + pos, (camera_num-pos)*sizeof(PtrBlock));
}
++camera_num;
CamBlock* newblock = new CamBlock(idcam, size, numframes);
camera_bufs[pos] = newblock;
return camera_bufs[pos];
}

bool CameraArray::RemoveBlock(unsigned short idcam)
{
unsigned short pos = GetPosition(idcam);
if (camera_num < 1)
{
return false;
}
camera_num--;
PtrBlock delblock = camera_bufs[pos];
delete delblock;
if (pos != camera_num)
{
memmove(camera_bufs + pos, camera_bufs + pos + 1, (camera_num - pos)*sizeof(PtrBlock));
}
if (max_num - camera_num > inc_num)
{
unsigned short len = ((camera_num/inc_num)+1)*inc_num;
PtrBlock* newbufs = NULL;
try{
newbufs = new PtrBlock[len];
}catch(...)
{
throw;
}
memcpy(newbufs, camera_bufs, camera_num*sizeof(PtrBlock));
delete[] camera_bufs;
camera_bufs = newbufs;
max_num = len;
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: