gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:31:03 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com