请各位看看,为什么时间一长就死机?还请各位耐心看看,分不够可再加!
牧童027 2002-08-11 02:33:18 还请各位耐心看看,分不够可再加!
我在做一个图像采集的程序。采集卡在每贞结束时调用一次myCallBack函数,该卡共连接了四个摄像头也就是说每贞结束共有四个myCallBack函数同时起动,且CallBack函数是异步的。在使用时采用了外部触发,外部每来一个电平信号采集卡就工作一次,由于外部信号来得极快,所以在myCallBack函数里来不及保存采集卡上的Buf到本地硬盘,所以我就想用内存来当缓存在CallBack中先把图像写入内存中,然后再开一线程把内存中的图像再存到硬盘中,但程序运行个几次后就出错?
//采集卡的CallBack函数
CORSTATUS CCONV myCallback( void *context, UINT32 eventType, UINT32 eventCount)
{
UINT32 *index,Tap;
index =(UINT32*)(context);
Tap = *index-1;//根据Index得出是第几路摄象头传来的CallBack
if(!VideoForm->bTrigger)//非触发方式
{
CorViewOnPaint(VideoForm->hView[Tap]);//非外部触发时,显示图像
}
else//触发方式
{
//CorBufferSave(VideoForm->hPCBuffer[Tap],aSaveFileName.c_str(),CORFILE_VAL_FORMAT_BMP);
//BYTE *buf = new BYTE[size];
BYTE *buf = (BYTE*)malloc(sizeof(BYTE)*size);
if(buf == NULL)
return CORSTATUS_OK;
CorBufferRead(VideoForm->hPCBuffer[Tap], 0, buf, size);//读取图片内容到新分配的内存里来
buflist[Tap].push_back(buf);//加入到相应的队列中,BufList是个STL的list<BYTE*> buflist[4];
mutex.Lock();//这是一个互斥对象,Lock表示进入临界区
nb ++;//nb为我设的一个全局记数器,记录总共有多少次CallBack以核对图像数目
mutex.UnLock();
}
return CORSTATUS_OK;
}
//////////////////////////////////////////////////////////////////
//图像存盘线程会先于CallBack开起。直至不会再有CallBack且四个队列都为空时退出
DWORD WINAPI ecp(void* pd)
{
BYTE *ptr, *src;
unsigned long i;
int number[4] = {0};
AnsiString dir = Form1->dir;
Graphics::TBitmap *pBmp = new Graphics::TBitmap();
VideoForm->butClose->Enabled = false;
pBmp->LoadFromFile("asd.bmp");//ASD是张标准图片,表示进来的图像的大小
for(i=0;i<nb||VideoForm->bc;)//bc是个Bool型变量,表示不会再有CallBack
{
for(int j=0;j<MAX_ACQINDEX;j++)//检查4个队列
{
if(buflist[j].empty())//没找到则换到下一队列
continue;
//若有图片,则取一张出来存盘
src = buflist[j].front();
if(src == NULL)
continue;
aSaveFileName=".\\" + dir + "\\" + IntToStr(j+1)+"_"+IntToStr(number[j]+1)+".bmp";
for(int row=0;row<pBmp->Height;row++)
{
ptr = (BYTE*)pBmp->ScanLine[row];
for(int col=0;col<pBmp->Width;col++)
{
//就是这里,运行一段时间后就提示我读取非法的内存地址。
ptr[col] = src[pBmp->Width*row + col];
}
}
//delete src;
free(src);
src = NULL;
buflist[j].pop_front();
pBmp->SaveToFile(aSaveFileName);
number[j]++;
i++;
}//end for j
}//end for i
delete pBmp;
return 1;
}
//-----------------------------------------------------------------------