TBitmap在线程中绘制有问题

我在线程中对TBitmap进行绘制时,发现有微小的机率绘制出现问题,出现问题的bitmap绘制结果是白色的。绘制方法是Canvas.Draw, 我又试了Bitblt(bmp.Canvas.Handle...)这种方式,同样也有问题。
但在主线程中不会出现这种情况。
 
还有TBitmap.Canvas.Pixels方法,在线程中也有问题,这个机率较大些,具体过程如下:
1. 在线程中创建一TBitmap,加载一个PixelFormat = pf1bit的位图(也就是通常黑白两色的mask)
2. 循环用TBitmap.Canvas.Pixels取出各点的颜色值,你会发现,取出的值有可能不等于clBlack,也不等于clWhite
 
为什么在线程中会出现这样的情况? 又该如避免?
=======================
回复于: 2012-03-12 12:47:03
TBitmap.Canvas.BeginUpdate;
xxx
TBitmap.Canvas.EndUpdate;
 
锁一下先。
==============================
回复于: 2012-03-12 13:28:24
引用 1 楼 iamduo 的回复:
TBitmap.Canvas.BeginUpdate;
xxx
TBitmap.Canvas.EndUpdate;
 
锁一下先。
 
没有这两方法呀,莫非是delphi7以后版本加的?
倒有这两个方法
  TBitmap.Canvas.Lock
  TBitmap.Canvas.Unlock
我应该试过了,也有问题(不是很确定)。
而且lock方法只是加了线程锁而已。 这个bitmap从创建、绘制、释放都在线程中,主线程根本没对它进行操作。加不加线程锁应该没有关系吧。
==========================
回复于: 2012-03-12 13:38:14
Delphi/Pascal code
?
1
2
3
4
5
6
uses SyncObjs;
var :TCriticalSection;
 
  UserListCs.Acquire;
//在这里写上绘图代码试试
  UserListCs.Release;
 
=====================================
回复于: 2012-03-13 11:07:03
经测试使用 TBitmap.Canvas.Lock, TBitmap.Canvas.Unlock后
TBitmap.Canvas.Pixels问题解决了。虽然有点奇怪,明明只有一个线程在访问,还要加线程锁。
Canvas.Draw的问题,因为先前的测试环境没有了,机率又很小,就没进一步验证。但我估计是没问题。
我先前的测试可能只是锁了部分的bitmap,没有把所有操作的bitmap都加锁。
 
另外case5166说的使用TCriticalSection对象,其实也是使用线程锁。跟TBitmap.Canvas.Lock中略有不同,但测试验证使用TCriticalSection对象无效。。。
就此结贴
原文地址:https://www.cnblogs.com/huapox/p/3299835.html