请各位看看,为什么时间一长就死机?还请各位耐心看看,分不够可再加!

牧童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;
}
//-----------------------------------------------------------------------
...全文
46 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
牧童027 2002-08-12
  • 打赏
  • 举报
回复
非常感谢各位,我看过出错时的状态,CPU和内存都有空闲的,我想可能是有指针为空了。
在些非常感谢各位仁兄的回答。
我想结贴算了。
RedSunRS 2002-08-11
  • 打赏
  • 举报
回复
你可以看看你的列表,那段,有可能是你加得太多占用内存太大,或是在程序释放ATL列表的时候,没有回收内存,而造成的内存泄漏。
你提供的代码不足够,而说明也不够。你可观察一下死机的时间和症状。只有两种可能,一是CPU时间耗尽,二是内存耗尽。你分析一下吧。建议你用new ,而不是malloc.
lllhaier 2002-08-11
  • 打赏
  • 举报
回复
你这种思路好象不太对!我想之所以死机是因为你每秒采集的图象桢数太多,而你又没有采取适当的处理方法造成的。你在采集函数中来不及存盘,估计你另开线程效果也不会很明显!存盘速度可能比采集函数读入数据到内存的速度慢,所以你的内存开销越来越大,以至出错。
建议你参考有关derectx的书籍!
cadinfo 2002-08-11
  • 打赏
  • 举报
回复
程序代码太长,也很专业,没有做过的朋友估计不太能够回答,
以前我也做过一段时间的图象采集开发,死机主要可能是没有复位。
-----------------------------------
提示读取非法内存地址可能是你中间出现了悬空指针,
或者所指地址无效,或者=NULL

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧