我正在研究 Kinect,偶尔 Kinect 会使 Visual Studio 崩溃。
当我在调试后调用 kinectSensor.Start()
方法时,我发现 Kinect 已经在另一个进程中使用.
但是没有其他进程在使用 Kinect! 它发生在早上启动我的机器并启动应用程序后的一次。 但大多数情况下,它发生在我启动 Kinect 应用程序时(在 VisualStudio 2010 中处于 Debug模式),我停止应用程序并在修改一些代码后重新启动应用程序,但那时它不起作用,我有上述异常和 2 秒后 Visual Studio 崩溃。
此外,我检查了 Kinect 是否已经在运行,但情况并非如此(在调试期间低于 Kinect 传感器的状态):
最奇怪的是,有时它可以正常运行数周,之后每两次/三次启动该应用程序,它就会运行两天。
我在这个问题上找到的唯一解决方案来自一个有非常相似问题的人(互联网上唯一的一个?):Imad Elayyan
当我启动 Process Explorer 时我发现 USB 端口处理存在完全相同的问题(如图所示),这是一个在我们关闭应用程序时未终止的变异进程。
但他的解决方案并不是真正的长期解决方案:我必须手动杀死突变体并重新启动 VisualStudio。有时我必须在早上重新启动 VS 20 次...
有没有办法正确关闭 USB 端口的句柄(在代码中?),以便在我关闭应用程序时它终止该句柄并且不再使 VS 崩溃?
如有任何帮助,我们将不胜感激,这真的让我感到困惑,让我发疯。
附加信息:
我正在使用 SDK1.5 + Kinect for Windows 但 SDK1.0 + Kinect XBox360 也是如此
我已经尝试用另一个 VS 实例调试 VS。
最佳答案
好的,谢谢大家的关心。我想我找到了问题的根源但是我仍然缺乏对句柄端口的解释。
事实:
我的解决方案中有 3 个项目,两个类库:
Kinect.dll
创建与设备的连接,处理手势 recognitionj 部分和游标创建。KinectControls.dll
它创建的控件(按钮、边框、3D 图表...)可以 与光标交互。以及一个测试项目。Kinect.dll启动Kinect事件+一些自定义事件:
ColorFrameReady
、DepthFrameReady
、GestureRecognised
...大部分事件都在程序集中,但有些是可见的 来自课外。
注册的每个事件都未注册(或者我认为如此)。
我实现了 facade pattern对于Kinect相关 类。 KinectFacade 拥有一个
KinectStop
方法来关闭 连接和注销事件。
问题的根源:
当应用程序关闭时,Application.Current.Shutdown()
方法调用 KinectStop 停止 Kinect 并注销程序集中的处理程序。但是在外部组件中,注销是在 Kinect 关闭后调用的(即使注销也是在 Application.Current.Shutdown()
上调用的),这导致了“基本/常规”错误。这样我就删除了注销。
当您没有注销 Kinect 事件并且 Kinect 关闭(调用 KinectSensor.stop()
方法)时,它(偶尔)保持 USB 句柄 即使应用程序关闭并且任何线程终止! 之后:无法重新打开应用程序(Kinect.Start()
崩溃),最后当您尝试关闭 Visual studio 它崩溃了(正如我的问题中所解释的)。
我找到的解决方案
当 KinectStop()
被调用时,我在关闭 Kinect 之前使用一个计时器,以便外部程序集中的每个类都可以注销事件。
此外,从现在开始,外部类不再提供“正常”事件:外观处理这些事件并引发 FastSmartWeakEvent可以从外部世界获得。它解决了内存泄漏问题,在某些情况下也可以解决我的问题。
从那时起,不再处理 USB 端口,Visual Studio 不再崩溃。
总结
我找到了问题的根源和绕过它的解决方案。我希望这会帮助任何有类似问题的人。
但是我仍然不明白为什么关闭应用程序和/或从 SDK 调用 KinectSensor.Stop()
方法不会关闭所有事件处理程序/线程/进程/端口句柄。为什么关闭 visual studio 会导致它崩溃,即使之前的一个仍在运行?
如果有人有建议,会受到欢迎吗?
关于c# - 如何关闭Kinect USB口的句柄以防止VisualStudio死机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11258849/