【发布时间】:2013-01-05 11:51:19
【问题描述】:
如果多个异步线程在全局 TBitmap 中绘制,会引发错误吗?我应该使用关键部分创建我的代码吗? (我在网上冲浪时发现 TBitmap.Draw 不是线程安全的)
另一个问题:如果许多同步线程在全局 TBitmap 中绘制,而 VCL Timer 异步读取 TBitmap 中的内容,这会引发错误吗?
谢谢!
【问题讨论】:
-
您真的需要全局 TBitmap 吗?我现在猜测了一下,但我认为您需要多个 TBitmap 实例。 TTimer 渲染的实例不应是其他线程当前正在写入的实例。
-
诀窍是,在视频渲染中,保留一个准备好的 TBitmap 队列,以便 TTimer 始终可以将一个队列取出并渲染它而无需任何同步。与忙于准备要排队的其他位图的其他线程一起。在一个位图实例上与互斥锁、临界区等同步会很混乱并且性能很差,即使您可以让它正常工作。如果您可以避免尽可能多的锁定/同步,多线程性能会更安全、更快——线程在不同的位图上工作,而不是正在渲染的位图。
-
@Martin 你不能真正在
TTimer上进行视频渲染。你需要比这更精确的东西。 -
@DavidHeffernan - 你可以!只有当 GUI 线程(以及 TTimer)无法获得足够的 CPU 来跟上帧速率时,才会出现问题。如果是这种情况,那么您使用哪种 VCL/多媒体计时器并不重要,是时候转向 DirectX 等了。
-
@Martin 嗯,我不相信。我认为你需要一个真正的计时器。
标签: multithreading delphi graphics asynchronous bitmap