我在线程中对TBitmap进行绘制时,发现有微小的机率绘制出现问题,出现问题的bitmap绘制结果是白色的。绘制方法是Canvas.Draw, 我又试了Bitblt(bmp.Canvas.Handle...)这种方式,同样也有问题。
但在主线程中不会出现这种情况。还有TBitmap.Canvas.Pixels方法,在线程中也有问题,这个机率较大些,具体过程如下:
1. 在线程中创建一TBitmap,加载一个PixelFormat = pf1bit的位图(也就是通常黑白两色的mask)
2. 循环用TBitmap.Canvas.Pixels取出各点的颜色值,你会发现,取出的值有可能不等于clBlack,也不等于clWhite为什么在线程中会出现这样的情况? 又该如避免?

解决方案 »

  1.   

    TBitmap.Canvas.BeginUpdate;
    xxx
    TBitmap.Canvas.EndUpdate;锁一下先。
      

  2.   


    没有这两方法呀,莫非是delphi7以后版本加的?
    倒有这两个方法
      TBitmap.Canvas.Lock
      TBitmap.Canvas.Unlock
    我应该试过了,也有问题(不是很确定)。
    而且lock方法只是加了线程锁而已。 这个bitmap从创建、绘制、释放都在线程中,主线程根本没对它进行操作。加不加线程锁应该没有关系吧。
      

  3.   

    uses SyncObjs;
    var :TCriticalSection;  UserListCs.Acquire;
    //在这里写上绘图代码试试
      UserListCs.Release;
      

  4.   

    经测试使用 TBitmap.Canvas.Lock, TBitmap.Canvas.Unlock后
    TBitmap.Canvas.Pixels问题解决了。虽然有点奇怪,明明只有一个线程在访问,还要加线程锁。
    Canvas.Draw的问题,因为先前的测试环境没有了,机率又很小,就没进一步验证。但我估计是没问题。
    我先前的测试可能只是锁了部分的bitmap,没有把所有操作的bitmap都加锁。另外case5166说的使用TCriticalSection对象,其实也是使用线程锁。跟TBitmap.Canvas.Lock中略有不同,但测试验证使用TCriticalSection对象无效
    就此结贴