c# - 如何关闭Kinect USB口的句柄以防止VisualStudio死机?

标签 c# visual-studio-2010 visual-studio kinect

我正在研究 Kinect,偶尔 Kinect 会使 Visual Studio 崩溃。

当我在调试后调用 kinectSensor.Start() 方法时,我发现 Kinect 已经在另一个进程中使用.

但是没有其他进程在使用 Kinect! 它发生在早上启动我的机器并启动应用程序后的一次。 但大多数情况下,它发生在我启动 Kinect 应用程序时(在 VisualStudio 2010 中处于 Debug模式),我停止应用程序并在修改一些代码后重新启动应用程序,但那时它不起作用,我有上述异常和 2 秒后 Visual Studio 崩溃。

此外,我检查了 Kinect 是否已经在运行,但情况并非如此(在调试期间低于 Kinect 传感器的状态):

state of kinect sensor (debug mode)

最奇怪的是,有时它可以正常运行数周,之后每两次/三次启动该应用程序,它就会运行两天。

我在这个问题上找到的唯一解决方案来自一个有非常相似问题的人(互联网上唯一的一个?):Imad Elayyan

当我启动 Process Explorer 时我发现 USB 端口处理存在完全相同的问题(如图所示),这是一个在我们关闭应用程序时未终止的变异进程。

mutant process for the USB handle of the Kinect

但他的解决方案并不是真正的长期解决方案:我必须手动杀死突变体并重新启动 VisualStudio。有时我必须在早上重新启动 VS 20 次...

有没有办法正确关闭 USB 端口的句柄(在代码中?),以便在我关闭应用程序时它终止该句柄并且不再使 VS 崩溃?

如有任何帮助,我们将不胜感激,这真的让我感到困惑,让我发疯。

附加信息:

我正在使用 SDK1.5 + Kinect for WindowsSDK1.0 + Kinect XBox360 也是如此

我已经尝试用另一个 VS 实例调试 VS。

最佳答案

好的,谢谢大家的关心。我想我找到了问题的根源但是我仍然缺乏对句柄端口的解释。

事实:

  1. 我的解决方案中有 3 个项目,两个类库:Kinect.dll 创建与设备的连接,处理手势 recognitionj 部分和游标创建。 KinectControls.dll 它创建的控件(按钮、边框、3D 图表...)可以 与光标交互。以及一个测试项目。

  2. Kinect.dll启动Kinect事件+一些自定义事件: ColorFrameReadyDepthFrameReadyGestureRecognised...

  3. 大部分事件都在程序集中,但有些是可见的 来自课外。

  4. 注册的每个事件都未注册(或者我认为如此)。

  5. 我实现了 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/

相关文章:

c# - 基于平台或字节序的条件编译器指令?

visual-studio-2010 - 如何将Visual Studio 2010帮助(F1)从本地更改为在线?

visual-studio - IIS Express 配置中的 allowdoubleescaping = "true"不起作用

c# - 如何检查参数化查询中的空值?

c# - 使用 C# 更新另一台机器(共享文件夹/网络)上存在的文件(web.config)中的值

c# - 在 ASP.Net 中使用 JavaScript

c# - 如何防止 WinForms 失去焦点?

.net - Visual Studio 2010 不调试 .NET 2.0 代码

visual-studio - 有人在 Windows 7 上使用 Visual Studio 2008 吗?

c# - 在 Visual Studio 2010 中为 IE 中的 BHO 使用断点