我在线程中对TBitmap进行绘制时,发现有微小的机率绘制出现问题,出现问题的bitmap绘制结果是白色的。绘制方法是Canvas.Draw, 我又试了Bitblt(bmp.Canvas.Handle...)这种方式,同样也有问题。
但在主线程中不会出现这种情况。还有TBitmap.Canvas.Pixels方法,在线程中也有问题,这个机率较大些,具体过程如下:
1. 在线程中创建一TBitmap,加载一个PixelFormat = pf1bit的位图(也就是通常黑白两色的mask)
2. 循环用TBitmap.Canvas.Pixels取出各点的颜色值,你会发现,取出的值有可能不等于clBlack,也不等于clWhite为什么在线程中会出现这样的情况? 又该如避免?
但在主线程中不会出现这种情况。还有TBitmap.Canvas.Pixels方法,在线程中也有问题,这个机率较大些,具体过程如下:
1. 在线程中创建一TBitmap,加载一个PixelFormat = pf1bit的位图(也就是通常黑白两色的mask)
2. 循环用TBitmap.Canvas.Pixels取出各点的颜色值,你会发现,取出的值有可能不等于clBlack,也不等于clWhite为什么在线程中会出现这样的情况? 又该如避免?
解决方案 »
- 相当奇怪fr3报表问题
- DELPHI是否有这样的控件??
- 如何让子窗体保持在主窗体之前?
- 30分!!! 如何把数据结果写入Edit.text
- 一个不知道的注册表
- 在这里下载个fastreport,一打开demo就说false不是有效integer值
- 用ado连接excel数据库的问题,解决马上给分。
- 急!用Delphi怎样实现nd5加密??
- 程序以服务执行时,如何获取系统登陆用户?!
- 往Excel文件里 装入图片,有多个工作表Sheet 时,在红色代码地方报错 OLE error 800A03EC ,导致图片装入不成功
- 求助:MDI窗口如何进行分割?
- 如何通过delphi向数据库中添加表,表名和字段都是在delphi界面上自定义的。
xxx
TBitmap.Canvas.EndUpdate;锁一下先。
没有这两方法呀,莫非是delphi7以后版本加的?
倒有这两个方法
TBitmap.Canvas.Lock
TBitmap.Canvas.Unlock
我应该试过了,也有问题(不是很确定)。
而且lock方法只是加了线程锁而已。 这个bitmap从创建、绘制、释放都在线程中,主线程根本没对它进行操作。加不加线程锁应该没有关系吧。
var :TCriticalSection; UserListCs.Acquire;
//在这里写上绘图代码试试
UserListCs.Release;
TBitmap.Canvas.Pixels问题解决了。虽然有点奇怪,明明只有一个线程在访问,还要加线程锁。
Canvas.Draw的问题,因为先前的测试环境没有了,机率又很小,就没进一步验证。但我估计是没问题。
我先前的测试可能只是锁了部分的bitmap,没有把所有操作的bitmap都加锁。另外case5166说的使用TCriticalSection对象,其实也是使用线程锁。跟TBitmap.Canvas.Lock中略有不同,但测试验证使用TCriticalSection对象无效
就此结贴