2010-03-03 40 views
0

我正在研究实时成像系统。C#后台线程在UI中导致滞后

UI线程:通过定时器以14 fps的速度从摄像头抓取图像并进行一些处理/显示。每2秒钟,通过处理选择3张图像(每张大约1mb),写入磁盘。这些放在共享队列中。

第二个线程:将映像出队并写入磁盘。已被赋予“最低”的优先权。

当第二个线程正在执行写操作时,它会从UI线程中消耗一个明显的perf块,并导致捕获降至14 fps以下。不能接受的。

我能在这里做什么?我不介意如果写入需要更长的时间并排队等待,那么会有大量的RAM和常规暂停,以便写入时间能够赶上。关键因素是UI线程有足够的果汁工作在14 fps。

+0

你是否从后台线程调用任何UI更新?它确实不应该影响你的用户界面。 – 2010-03-03 12:43:11

+2

等一下,你为什么要在UI线程上从相机中抓取图像? – 2010-03-03 12:44:37

+0

没有人拥有单核CPU了。你正在做某种锁定,会减慢捕捉图像的线程。 – 2010-03-03 13:40:53

回答

2

为了得到一个认真的答案,你应该使用某种探查器工具。如果你搜索一个stackoverflow或谷歌,你会发现很多。大多数情况下,你必须为它们付费,但幸运的是,还有一些试用版本可以测试以发现问题。

但我没有任何分析器的猜测是,磁盘上的I/O操作会导致性能问题。所以,如果你尝试使用SparseFile和/或MemoryMappedFile(我知道它是.Net 4,但是它只是一个对Win32 API的包装,你可以从那里提取类并使用它它在.Net 2)。

+0

谢谢,只是为了澄清:应用程序的其余部分不接触硬盘驱动器。它不等待任何读取或写入。为什么在另一个线程中写入会影响捕获/处理?它是一个双核心CPU,其中一个核心处理饱和,另一个免费;我希望写作。 – Bicubic 2010-03-03 12:57:24

+0

我也没有一个很好的解释,但访问硬盘驱动器总是会减慢整个系统,因为它总是成为某种瓶颈。 – Oliver 2010-03-03 14:49:37

2

realtime,windows和c#不能很好的一起工作。如果帧速率低于14fps时“不可接受”,则可以寻找窗口的一些实时扩展,如RTXINtime

您也可以尝试以较小的块将文件写入磁盘,在写操作之间添加短Thread.Sleeps()以允许执行更多任务切换,并确保在每次写入后刷新文件流。

0

也许你应该在执行操作后将文件保存到不同的位置。有可能该文件在处理时被锁定,并且UI线程等待它被释放。

0

正如其他人所说:硬实时不会在这里工作。

试着找出设备是否共享资源(坏例子:在同一个USB总线上,磁盘和相机)。与分析器一起检查它是否是限制捕获或IO的CPU。也许这只是你的代码的错误(泄漏资源,浪费周期)。没人能说,但你可以(也应该)检查它。

可能的“解决方案”,这取决于你的发现:

使用队列(MSMQ例如),只是堆放图像,从来没有从那里读(甚至没有降低线程的优先级),直到你达到你的“暂停”。这实际上需要“大量的RAM”。