本帖最后由 mopishv0 于 2010-12-17 23:27:22 编辑

解决方案 »

  1.   

    是不是某些gif图片的问题?我以前录制的一个软件操作演示的gif,在ie里播放都会导致内存占用剧增
      

  2.   

    gifFinish是怎么取值的?每次系统启动时取一次还是每次用之前去一次?
      

  3.   

    imgBG.Canvas.Draw(imgRun.Left, imgRun.Top, gifFinish);利用try except end结构,确定在异常发生时,imgRun.Left, imgRun.Top这2个值到底是多少
    有时候多线程下,delphi会出现出人意料的问题
      

  4.   

    doublebuffer:=true试试,不过估计没有什么作用,错误提示内容是“系统资源不够”,估计是有什么东西一直在创建,而没有释放做成的
      

  5.   

    绘制完成后,加载下一次绘图时记得释放前个图片由于绘制是bmp保存图片信息 所以相对比较大可能会比较占内存
      

  6.   

    这个应该不是问题所在
    如果是位置不对的话应当每次都会出现问题的
    left是个固定值
    而且出问题时 TOP值还在正常范围内
      

  7.   

    imgBG.Canvas.Lock;
    try
      imgBG.Canvas.Draw(imgRun.Left, imgRun.Top, gifFinish);
    finally
      imgBG.Canvas.UnLock;
    end;
    这样应该能解决.因为Canvas不是线程安全的,需要锁定后操作
      

  8.   

    恩 这个办法用过了 
    主要BUG太难重现 需要知道 BUG的根本原因 然后找到重现的方法 才能证明这样确实是对的
    谢谢
      

  9.   

    哈哈,我找到了
    问题出在delphi本身
    在delphi中,
      try
        lock;
        程序段 
      finally
        unlock;
      end
    结构,在程序段中出现超出范围错时,并不能保证会准确的执行finally段的unlock指令,造成资源被锁定
      try
        lock;
        try
          程序段 
        except
          标记
        end;
      finally
        unlock;
      end
      可以通过以上方式验证,在标记处下断点
      其实,通过上面的方式,跑飞的代码已经被except强行拉回,已经可以初步解决Out of system resources,  为严谨起见,最好还是彻底解决 程序段 中存在的隐患为佳  以上是我自己解决的办法,在我的程序中已经确证,希望你有用
      

  10.   

    至于重现bug的方式,我是开了30个以上的线程同时操作相同的代码段,在except中下断点
      

  11.   

    如果在程序中没有使用lock 与unlock出现这样的问题呢?如何解决
      

  12.   


    必须使用lock 与unlock吧
    否则多线程时会有问题