如果有很多异步线程在全局TBitmap中绘制,那么会出现错误吗?我应该使用关键部分创建我的代码吗? (从我在互联网上的冲浪我发现TBitmap.Draw不是线程安全的)
另一个问题:如果许多同步线程在全局TBitmap中绘制并且VCL Timer以异步方式读取TBitmap中的内容会导致错误吗?
谢谢!
答案 0 :(得分:4)
由于您的线程都在修改相同的位图,因此您需要序列化对该位图的所有访问。这意味着阅读其内容以及写入内容。
当然,这假设绘制到共享位图的多个线程是解决问题的正确方法。在不知道你的实际问题是什么的情况下,我无法对此发表评论。
<强>更新强>
由于Remy's answer中描述的问题,您在绘制到位图时也必须使用Lock/Unlock
。哪个应该是这个问题的接受答案。
答案 1 :(得分:4)
是的,您需要保护TBitmap
不跨多个线程的并发访问。关键部分适用于序列化绘图代码,但这本身还不够!主线程缓存GDI资源并定期对它们执行清理,这将影响您的TBitmap
。因此,每当绘制/渲染时,您都需要Lock/Unlock()
TBitmap.Canvas
以确保VCL不会消除其背后的资源。
答案 2 :(得分:1)
使用监视器或信号量来控制TBitmap像素中的线程变化时的线程!
答案 3 :(得分:0)
您可以使用TThread.Synchronize方法吗?
根据TThread课程的doco
以下是使用线程时需要注意的问题和建议:
跟踪太多线程会占用CPU时间;建议的限制是单处理器系统上每个进程16个活动线程。
当多个线程更新相同的资源时,必须同步它们以避免冲突。
访问对象和更新表单的大多数方法只能在主线程中调用,或者使用同步对象,如TMultiReadExclusiveWriteSynchronizer。