【发布时间】:2010-07-27 14:17:21
【问题描述】:
我的应用程序正在使用图像处理库来处理长时间运行的任务。带有设置和控件的主 UI 在 WPF 中实现。图像处理需要显示,主 UI 需要保持响应。单击主 UI 中的“处理”按钮后,会生成一个新线程,该线程会创建一个新的 WinForm 窗口来显示处理后的图像。
在多线程之前,UI 会在处理时挂起,并且在 WinForm 中可以看到用于显示图像的进度。然后,当处理完成时,WinForm 将保留其中的图像。事件被添加到允许平移和缩放的新 WinForm。平移和缩放功能正常工作。
由于项目的要求,很明显它需要多线程才能正常运行。
现在有了新线程,WinForm 窗口像以前一样被创建,图像被处理和显示。问题是当这个方法完成时线程退出。让线程退出意味着如果未释放分配的图像缓冲区,则应用程序将引发异常。为了解决这个问题,有一个方法调用来在线程退出之前释放所有分配。这修复了异常并使整个线程成功执行,但这意味着图像显示缓冲区和显示它的表单被释放/处置,因此没有时间用于缩放和平移事件。
使线程不退出的最佳解决方案是创建一个 AutoResetEvent 并在图像处理线程的末尾有这样的东西。
while (!resetEvent.WaitOne(0, false)) { }
threadKill(); // frees all allocations
AutoResetEvent 由主 UI 上的一个按钮触发,该按钮会终止线程。这可以让图像在需要时显示并由用户明确终止,但是它无法允许触发使图像平移和缩放所需的 Click 和 Drag 事件。有没有办法让线程不退出而没有旋转的while循环来防止事件被触发?所需的功能是让线程保持活动状态,以便不必释放分配并且可以实现平移和缩放。
即使解决方案对于线程处理经验丰富的人来说可能是显而易见的,但由于我是多线程应用程序的新手,因此我们将不胜感激。
谢谢
编辑:应该知道最终目标是显示一个恒定的帧流,这些帧以这种方式从图像采集卡获取。所以我认为在后台单独处理它们然后在主 UI 中显示它们是行不通的,因为需要有一个恒定的显示流,这会锁定主 UI。
编辑:这个问题的真正意图不是找到更好的方法来做类似的事情。相反,我问是否可以阻止新线程退出,以便可以触发点击事件。如果使用 System.Threading.Thread 无法实现此行为,那么说无法实现也将是一个可接受的答案。
【问题讨论】:
标签: c# wpf winforms multithreading