マルチセンサー取得ツールを開発していますが、(ウェブカメラからの) 画像をハード ドライブに保存する際に問題が発生しています。
そのために、次の 3 つのスレッドを使用しています。
- ウェブカメラからキャプチャされた画像を継続的に収集する 1 つのスレッド。
- 最後の画像を収集してファイル保存メソッドに送信するタイマー スレッド。
- タイマー スレッドは、メインのタイマー スレッド機能に干渉しないように、保存する 3 番目のスレッドを呼び出します。
これは、低周波ではうまく機能します。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);
}
});
}
}
また、Task スレッド (保存用) とロックなしで試しました。これら 2 つは、タイマーの時間間隔よりも保存に時間がかかるため、競合状態になります。
アーキテクチャと .NET 機能の両方の観点から、これを行うためのより良い方法があると確信しています。これのパフォーマンスを向上させるための助けがあれば大歓迎です!