我在一个循环中反复调用CPicture类的一个Load(IStream* pstm)函数用来装载Jpeg图像,然后来显示。循环中的代码片断如下
////////////////////////////////////////////////////////
AcquireWriteLock(&lock);
if (WriteOK(&lock))
{
     TRACE("Arrived here!_____");
     bIsPicture=Load(pStream);
     TRACE("Stopped here!\n");
}
else
{
....
}
ReleaseWriteLock(&lock);
//////////////////////////////////////////////////////
Load(pStream)是一个CPicture类的函数,原型为
BOOL CPicture::Load(IStream* pstm)
{
Free();
HRESULT hr = OleLoadPicture(pstm, 0, FALSE,
IID_IPicture, (void**)&m_spIPicture);
if(SUCCEEDED(hr) && m_spIPicture)
{
ASSERT(SUCCEEDED(hr) && m_spIPicture);
return TRUE;
}
else
{
return FALSE;
}
}
这个函数在我循环中执行了大约50000次,死掉了,郁闷啊!不知道该怎么办了!!!高人们给点指导啊,项目快到Deadline了。

解决方案 »

  1.   

    哥们,你别光load不release啊
    记着给m_spIPicture release
      

  2.   

    release了,Load()的一开始就Free()了啊,这个Free()就调用了release
    void Free() 
    {
    if (m_spIPicture) 
             {
    m_spIPicture.Release();
    }
    }
      

  3.   

    我现在也遇到同样的问题,要连续读入30000个jpeg图像。用Cpicture类不一定可以,好像需要用IJL,不过还没有搞定。
    qq:11304309,请指教。
      

  4.   

    我的试了50000循环,没事。
    估计是相关的GDI资源出了问题,忘了释放吧?打开任务管理器看看性能栏。
      

  5.   

    搞定了,CPicture类用的OleLoadPicture()没有很好的容错功能,你可以这样做一个试验,用这个函数load一个残缺的图像,比如只有标准jpeg开头的10个字节,那么这个函数会在里面死循环,耗去整个CPU。微软的API也烂啊,一个教训是不要迷信微软的API,以前我死活也没有想到OleLoadPicture()这个函数也会有问题。对了,解决这个问题有两个办法,第一,检查入口参数,看看哪些情况会导致OleLoadPicture死掉,然后你把这些情况过滤掉。第二个方法比较彻底,就是不要使用微软的这个函数,直接使用IJG的库。但是你要对这个库有所研究,还要冒一些线程安全的风险(在VC里使用标准C的东西)。GOOD luck!
    揭帖,多谢!
      

  6.   

    其实,直接用IJL是最好的选择,速度快,内存管理好!
      

  7.   

    解决了,用IJL提供的一些函数即可。可以从网上下载QuickJpeg,稍加修改就行了。
    http://www.lovesnow.com/down/soft.asp?id=8