gpt4 book ai didi

c# - 如何在单独的线程中将文件保存到硬盘?

转载 作者:太空狗 更新时间:2023-10-29 21:36:29 26 4
gpt4 key购买 nike

我有一个相机,我正在将图像实时读取到一个数组中。我正在对图像应用一些算法并显示它。然后我得到下一张图片并显示它。所以我正在将图像从相机流式传输到显示器。但是,我还想在显示图像后将它们保存到硬盘上。我尝试使用主线程,但一切都变慢了。然后我尝试使用 ThreadPool(见下面的代码)。这不会减慢显示速度,但我发现图像没有正确保存。看起来它们没有按预期的顺序排列,并且在保存了大约 50 张图像后,后续图像数据看起来是乱码。我猜启动了太多线程。

有更好的方法吗?我想我只需要一个线程来保存图像。也许是某种顺序保存每个图像的队列。只要它在后台完成并且不会减慢显示速度。如果有人可以发布代码片段,那就太棒了。

short[] image1 = new short[20000];
while(streaming)
{
ReadImageFromCamera(ref image1)
ImageData data;

data.fileName = imageNumber;
data.image = image1;

ThreadPool.QueueUserWorkItem(WriteImageToFile, data); // Send the writes to the queue
}


private void WriteImageToFile(object imageData) {

try {
ImageData data = (ImageData)imageData;
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

string fName = myDirectory + @"/" + Convert.ToString(data.fileName) + @".spe";

using (Stream myStream = new FileStream(fName, FileMode.Create)) {
bf.Serialize(myStream, data.image);
}
}
catch (Exception) { }
}

最佳答案

我认为您应该避免为每个特定图像启动一个新线程。由于您只有一个硬盘驱动器并将所有文件存储在一个目录中,因此您应该只使用一个磁盘写入器线程。然后我建议使用一些并发队列将作业从相机线程传输到磁盘写入器线程。我没有展示“代码片段”,因为这不是几行代码就能写出高质量的东西。

此外,您绝对必须在某处为每个图像放置“new short[20000]”,否则在将其保存到磁盘之前它会被下一张图像覆盖。

此外,我希望在主线程中写入文件就足够了,因为当您将数据写入磁盘时,Windows 会自动使用并发技术(主要是磁盘缓存)。您确定您的硬件足够快以实时写入所有这些数据吗?

关于c# - 如何在单独的线程中将文件保存到硬盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4862077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com