如果许多异步线程在全局TBitmap上绘制,会报错吗?我应该使用关键字来创建我的代码吗?(从我在互联网上的搜索中发现,TBitmap.Draw不是线程安全的)另一个问题:如果许多同步线程在全局TBitmap上绘制,并且VCL Timer从TBitmap异步读取内容,那么这会导致错误吗?谢谢!
TBitmap
免受多个线程的并发访问。临界区对于串行化绘图代码是可以的,但仅此还不够!主线程会缓存GDI资源并定期对其进行清理,这将影响您的TBitmap
。因此,在绘制/渲染时,您还需要Lock/Unlock()
TBitmap.Canvas
以确保VCL不会在背后撤出其资源。由于您的所有线程都修改同一个位图,因此您需要序列化对该位图的所有访问。这意味着读取其内容以及向其写入。
当然,这假定多个线程绘制到共享位图是解决您问题的正确方案。不知道您实际问题是什么,我无法对此发表评论。
更新
由于Remy's answer中描述的问题,绘制位图时还必须使用Lock/Unlock
。这应该是此问题的被接受答案。
你可以使用TThread.Synchronize方法代替吗?
根据TThread类的文档,
TTimer
上进行视频渲染。你需要比那更精确的东西。 - David Heffernan