Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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
C# 如何从回调编写AVI,保持UI响应并等待完成_C#_Multithreading_Callback_Freeze_Avi - Fatal编程技术网

C# 如何从回调编写AVI,保持UI响应并等待完成

C# 如何从回调编写AVI,保持UI响应并等待完成,c#,multithreading,callback,freeze,avi,C#,Multithreading,Callback,Freeze,Avi,我必须为显微镜使用摄像头SDK,该显微镜附带一个示例C#Windows窗体应用程序。 SDK功能通过DLLImport导入应用程序。 在这个示例应用程序中,通过回调函数从RAM读取相机的单个帧。 然后,此回调函数更新PictureBox以显示实时图像 但是,为了我的使用,我不仅要显示帧,还要记录它们。 我认为最简单的方法是使用。 但是,我不知道如何初始化AviWriter(显然,我不能每次调用回调函数时都初始化它),然后从回调函数将单个帧添加到流中 目前,我通过使用另一个函数解决了我的问题,该函

我必须为显微镜使用摄像头SDK,该显微镜附带一个示例C#Windows窗体应用程序。 SDK功能通过DLLImport导入应用程序。 在这个示例应用程序中,通过回调函数从RAM读取相机的单个帧。 然后,此回调函数更新PictureBox以显示实时图像

但是,为了我的使用,我不仅要显示帧,还要记录它们。 我认为最简单的方法是使用。 但是,我不知道如何初始化AviWriter(显然,我不能每次调用回调函数时都初始化它),然后从回调函数将单个帧添加到流中

目前,我通过使用另一个函数解决了我的问题,该函数在一个单独的线程中等待一个公共计数器上升——计数器本身在回调函数中更新。 每次计数器更新时,此函数也会从RAM读取帧并将其添加到AviWriterStream。 最重要的是,我必须使用

var resetEvent = new ManualResetEvent(false);

System.Threading.ThreadPool.QueueUserWorkItem(delegate
{

    WriteAVI()
    resetEvent.Set();

}, null);

resetEvent.WaitOne(); 
这是因为我需要在不同的XY位置录制多个视频,所以每次我的for循环到达新的XY位置时,录制都会被触发,我必须确保仅在录制实际完成后移动到下一个位置

我这样做的方式很明显是一种刻薄和非常糟糕的做法(我已经感觉很糟糕,但只是不知道更好),我想知道正确的解决方案是什么。 到目前为止,它的工作-只是UI冻结真的很烦人

编辑:这可能是两个问题: 1) 如何将帧正确写入AVI和
2) 如何在不冻结我的UI的情况下等待录制完成,这是一个复杂的问题,但从源代码开始,您将启动一个线程(
QueueUserWorkItem
),在下一行,您将等待录制完成(
resetEvent.WaitOne()
)。如果启动后您已经在下一行等待它完成,为什么要将它放在单独的线程中?对我来说,它看起来像是
resetEvent.WaitOne()是不需要的。因为没有单独的线程,我将无法等待计数器更新并将下一帧添加到AVI。然而,在不等待线程完成的情况下,我的for循环将直接一个接一个地转到所有XY位置,在第一个位置未完成的情况下开始新的录制。这是有意义的。为什么不在线程中等待计数器的更新呢<代码>resetEvent.WaitOne()
将阻止你的UI代码,因此你需要找到一种方法来摆脱它。我不明白你的意思。我正在等待单独线程中计数器的更新(通过使用while(counterwhile不在发布的代码中。但是如果您将
while…
代码放在发布的线程代码中的
WriteAvi();
之前,情况如何?