【发布时间】:2013-09-04 07:10:15
【问题描述】:
我们正在开发一种多传感器采集工具,但在将图像(来自网络摄像头)保存到硬盘时遇到了问题。
我们为此使用了三个线程:
- 一个线程不断地从网络摄像头收集捕获的图像。
- 收集最后一张图像并将其发送到文件保存方法的计时器线程。
- 定时器线程调用第三个线程进行保存,以免干扰主定时器线程功能。
这适用于低频。当我们将 FPS 提高到 30 左右时,我们开始丢失图像。请注意,我们有多个传感器,而不仅仅是一个网络摄像头。这就是我们使用这种架构而不是直接从网络摄像头线程保存文件的原因(我们需要保持一切同步)
这是 save 方法的当前实现:
private void saveImageFrame(Bitmap b, ulong frameID)
{
string fileSavePath = _path+ "//";
if (b != null)
{
Task.Factory.StartNew(() =>
{
lock (_lock)
{
Bitmap toSave = new Bitmap(b);
string fileName = fileSavePath + frameID.ToString() + ".bmp";
toSave.Save(fileName);
}
});
}
}
我们还尝试了不使用任务线程(用于保存)和不使用锁。这两种情况会导致竞争条件,因为保存所需的时间比计时器时间间隔要长。
我确信在架构和 .NET 功能方面都有更好的方法来做到这一点。任何有助于提高性能的帮助将不胜感激!
【问题讨论】:
-
不确定我是否了解数据流和计时器。当网络摄像头线程组装了一个图像实例时,为什么它不立即将该实例排队到保存线程上,例如 BlockingCollection 并立即为下一张图像创建一个新实例?
-
由于我们有多个传感器(不仅仅是网络摄像头)并且我们希望它们都具有相同的密钥(在这种情况下是 FrameID),我们希望它们都由一个主要组件保存提供此密钥。希望这可以澄清
标签: c# multithreading bitmap save sensor-fusion