multithreading - 如何从后台线程有效地对 Delphi 6 框架或表单执行图像流预览?

标签 multithreading delphi bitmap video-streaming vcl

我有一个 Delphi 6 应用程序,用于接收和处理来自外部摄像头的图像流。我将代码放在后台线程上,因为它占用大量 CPU,而且我不希望它干扰在主线程上运行的用户界面代码。我想使用我从以每秒 25 帧的速率接收的相机 JPEG 帧创建的 TBitmap 来更新表单或框架上的矩形区域。

我想知道哪种方法可以获得最佳性能,以及使用哪些 Windows API 调用或 Delphi 调用来实现此目的。我想我不应该使用 TImage 或 TPicture 或类似的 VCL 组件,因为它们在主线程上运行,而且我很确定尝试通过 Synchronize() 调用完成任何事情将会效率低下,并且有可能减慢速度向下涉及的线程。我还想要一种能够提供平滑视频显示的技术,就像双缓冲控件一样,没有任何“条纹”效果。此外,任何有关正确 Canvas 锁定或设备上下文管理等的提示都将受到赞赏,尤其是有关避免释放资源时常见错误的提示。

当然,如果有一个能够满足我需要的优秀代码示例的链接就太好了。

最佳答案

AFAIK TBitmap 是线程安全的,如果您仅在其 Canvas 上工作。如果您发送 GDI 消息并需要刷新屏幕,则需要 Synchronize,但从我的实验来看,使用 TBitmap.Canvas 只是线程安全 Windows API 的包装。如果您使用像素算术(例如使用 Scanline)处理位图,每个线程一个唯一的位图,您可以在后台执行此操作。

但我怀疑使用 TBitmap 并不是最有效的方法。尝试一下 http://graphics32.orghttp://aggpas.org这是处理位图的非常快速的方法。

如果可以,正如 imajoosy 所建议的那样,处理输入流的最佳方法是使用直接 X 流处理功能。

对于线程安全的进程,如果每个线程将消耗 100% 的核心(这对于图像处理来说很可能),通常假设您最好为处理创建 NumberOfCPU-1 线程。例如,您可以创建一个线程池,然后让它们使用输入流中的位图。

关于multithreading - 如何从后台线程有效地对 Delphi 6 框架或表单执行图像流预览?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8708312/

相关文章:

java - Lucene 锁定异常

javascript - Node.js fs.readfile 无限工作

delphi - 进一步澄清 : How to correctly write Try. .Finally ..除了语句?

在 C 中创建位图

c - GDI 单色位图在每次创建 HBITMAP 时翻转位

.net - .NET 事件、线程和 COM 上下文如何协同工作?

delphi - 使用 TJpegImage 组件将 bmp 转换为 jpg 时出现问题

c# - 使用 Delphi 使用 WCF - 最大字符串内容长度配额 (8192) 错误

android - android Canvas 上位图的闪烁

c++ - 异常传播和 std::future