在Bitmaps Delphi中绘制异步线程

时间:2013-01-05 11:51:19

标签: multithreading delphi graphics asynchronous bitmap

如果有很多异步线程在全局TBitmap中绘制,那么会出现错误吗?我应该使用关键部分创建我的代码吗? (从我在互联网上的冲浪我发现TBitmap.Draw不是线程安全的)

另一个问题:如果许多同步线程在全局TBitmap中绘制并且VCL Timer以异步方式读取TBitmap中的内容会导致错误吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

由于您的线程都在修改相同的位图,因此您需要序列化对该位图的所有访问。这意味着阅读其内容以及写入内容。

当然,这假设绘制到共享位图的多个线程是解决问题的正确方法。在不知道你的实际问题是什么的情况下,我无法对此发表评论。

<强>更新

由于Remy's answer中描述的问题,您在绘制到位图时也必须使用Lock/Unlock。哪个应该是这个问题的接受答案。

答案 1 :(得分:4)

是的,您需要保护TBitmap不跨多个线程的并发访问。关键部分适用于序列化绘图代码,但这本身还不够!主线程缓存GDI资源并定期对它们执行清理,这将影响您的TBitmap。因此,每当绘制/渲染时,您都需要Lock/Unlock() TBitmap.Canvas以确保VCL不会消除其背后的资源。

答案 2 :(得分:1)

使用监视器或信号量来控制TBitmap像素中的线程变化时的线程!

答案 3 :(得分:0)

您可以使用TThread.Synchronize方法吗?

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_TThread_Synchronize@TThread@TThreadMethod.html

根据TThread课程的doco

  

以下是使用线程时需要注意的问题和建议:

     

跟踪太多线程会占用CPU时间;建议的限制是单处理器系统上每个进程16个活动线程。

     

当多个线程更新相同的资源时,必须同步它们以避免冲突。

     

访问对象和更新表单的大多数方法只能在主线程中调用,或者使用同步对象,如TMultiReadExclusiveWriteSynchronizer。