zoukankan      html  css  js  c++  java
  • 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对象无效。。。
    就此结贴
  • 相关阅读:
    Javascript之数组遍历
    Javascript中的原型、原型链(十)
    Javascript中的对象(八)
    记一次包含iframe的需要滚动的元素不能滚动到底部的问题
    元素等比缩放解决方案
    元素高度自适应屏幕高度解决方案
    浏览器同源策略及规避方案
    Ansible环境搭建
    Ldap 从入门到放弃(二)
    Ldap 从入门到放弃(一)
  • 原文地址:https://www.cnblogs.com/huapox/p/3299835.html
Copyright © 2011-2022 走看看