首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从后台线程高效地对Delphi6帧或窗体执行图像流预览?

如何从后台线程高效地对Delphi6帧或窗体执行图像流预览?
EN

Stack Overflow用户
提问于 2012-01-03 13:30:52
回答 1查看 1.1K关注 0票数 4

我有一个Delphi6应用程序,它接收和处理来自外部摄像头的图像流。我把代码放在后台线程上,因为它占用大量CPU资源,我不想让它干扰在主线程上运行的用户界面代码。我想用我从相机JPEG帧创建的TBitmaps更新窗体或帧上的矩形区域,这些JPEG帧是以每秒25帧的速率接收的。

我想知道什么方法能给我带来最好的性能,以及Windows API调用或Delphi调用用来做这件事。我想我不应该使用TImage或TPicture或类似的VCL组件,因为它们在主线程上运行,我非常确定试图通过Synchronize()调用来完成任何事情都将是低效的,并且有可能减慢相关线程的速度。我也想要一种技术,提供像双缓冲控件一样的平滑视频显示,而没有任何“条带化”效果。此外,任何关于合适的画布锁定或设备上下文管理等方面的技巧都将受到感谢,特别是在释放资源时避免常见错误的技巧。

当然,如果能链接到我需要的代码示例,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-03 17:17:48

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

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8708312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档