Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何从后台线程高效地对Delphi6帧或窗体执行图像流预览?_Multithreading_Delphi_Bitmap_Video Streaming_Vcl - Fatal编程技术网

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

Multithreading 如何从后台线程高效地对Delphi6帧或窗体执行图像流预览?,multithreading,delphi,bitmap,video-streaming,vcl,Multithreading,Delphi,Bitmap,Video Streaming,Vcl,我有一个Delphi6应用程序,它接收并处理来自外部摄像头的图像流。我把代码放在后台线程上,因为它占用大量CPU,我不希望它干扰在主线程上运行的用户界面代码。我想用我从相机的JPEG帧创建的TBitmaps更新窗体或帧上的矩形区域,该帧以每秒25帧的速率接收 我想知道什么方法能给我最好的性能,以及使用什么Windows API调用或Delphi调用来实现。我想我不应该使用TImage、TPicture或类似的VCL组件,因为它们在主线程上运行,我很确定尝试通过Synchronize()调用完成任

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

我想知道什么方法能给我最好的性能,以及使用什么Windows API调用或Delphi调用来实现。我想我不应该使用TImage、TPicture或类似的VCL组件,因为它们在主线程上运行,我很确定尝试通过Synchronize()调用完成任何事情都是低效的,并且可能会降低相关线程的速度。我还希望有一种技术能够像双缓冲控件那样提供平滑的视频显示,而不会产生任何“条纹”效果。此外,任何关于正确的画布锁定或设备上下文管理等的提示,尤其是关于在释放资源时避免常见错误的提示,都将不胜感激


当然,一个链接到一个好的代码示例,可以满足我的需要,这将是非常好的。

AFAIK
TBitmap
是线程安全的,如果您只在它的画布上工作的话<如果您发送GDI消息并需要刷新屏幕,则需要“代码>同步”,但根据我的实验,使用
TBitmap.Canvas
只是线程安全Windows API的包装器。如果使用像素算法处理位图(例如使用
扫描线
),每个线程一个唯一的位图,则可以在后台执行

但是我怀疑使用
TBitmap
不是最有效的方法。尝试一下使用位图的快捷方式

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


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

为什么是N-1?什么不是N?把它推向极端并考虑一个核心机。那永远也做不成任何事。可能是协调线程占用了-1,但最有可能的是它几乎一直处于空闲状态,因此为它保留一个完整的内核是浪费的。@DavidHeffernan N-1对于单核CPU来说当然是1。引用我见过的一些常见的实现模式,这是一个通用规则。保留一个内核不使用是一个好主意,可以让后台系统任务(包括防病毒和主Windows/桌面)毫无问题地工作。此外,您还可以根据每个任务的渲染速度添加上限(例如,如果您有8核CPU,则最多可添加4个线程)(因为众所周知,超线程内核的效率不如“本机”内核)。当线程数为N或>N时,总体处理速度将降低。我的经验是,为此类任务饱和所有N个内核可以最快地完成任务。而现代的超读内核也相当不错。最新的英特尔版本值得使用。我猜他们上一轮的名声太差了(这是理所当然的),以至于英特尔甚至不再推这个名字了@DavidHeffernan我认为N或N-1没有太大区别,如果是的话,我不能给你任何好的代码示例,但我强烈建议你看看你想做什么。你是通过什么方式从外部摄像机接收图像流的?直接放映,还是虚拟电影?除非您有特定的理由使用TBitmpas,否则我将尝试使用其中一种直接显示渲染器,因为这很可能是渲染相机图像流的CPU效率最高的方法。