0

我一直在使用 Kinect for Windows SDK 1.8 一段时间,只是在一段时间后重新熟悉它。我有一个基本的应用程序正在运行,它使用颜色和骨架流在用户的视频源上覆盖骨架,同时还实时显示他们躯干的 X、Y 和 Z 坐标。所有这一切都完美无缺,但我遇到了关闭应用程序的问题。首先,我的 Window_Close 事件如下所示:

private void Window_Closed(object sender, EventArgs e)
{
    // Turn off timers.
    RefreshTimer.IsEnabled = false;
    RefreshTimer.Stop();

    UpdateTimer.IsEnabled = false;
    UpdateTimer.Stop();

    // Turn off Kinect
    if (this.mainKinect != null)
    {
        try
        {
            this.mainKinect.Stop();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        this.TxtBx_KinectStatus.Text += "\n[" + DateTime.Now.TimeOfDay.ToString() + "] " + this.mainKinect.UniqueKinectId.ToString() + " has been turned off.";
    }

    // Shut down application
    Application.Current.Shutdown();
}

我添加了“Application.Current.Shutdown()”只是因为当我关闭窗口时我的程序会挂起并且永远不会真正关闭。我单步执行该函数,发现它挂在 this.mainKinect.Stop() 上,其中 mainKinect 是引用物理 Kinect 的 Kinect 对象。我认为它可能无法正确关闭两个流,所以我添加了

this.mainKinect.ColorStream.Disable();
this.mainKinect.SkeletonStream.Disable();

就在 Stop() 之前。我发现它实际上挂在 SkeletonStream.Disable() 上,我不知道为什么。我其余的大部分代码都直接来自他们的示例,所以我不知道为什么这不起作用。如果您有任何想法,或者希望我发布更多我的代码,请不要犹豫。

4

1 回答 1

2

我总是检查所有流,如果它们被启用。我禁用任何启用的流,下一步是分离所有先前附加的事件处理程序,最后我在 try-catch 块中调用 Stop() 并记录异常消息以在出现任何问题时获得提示。

public void StopKinect()
{
   if (this.sensor == null)
   {
       return;
   }

   if (this.sensor.SkeletonStream.IsEnabled)
   {
      this.sensor.SkeletonStream.Disable();
   }

   if (this.sensor.ColorStream.IsEnabled)
   {
      this.sensor.ColorStream.Disable();
   }

   if (this.sensor.DepthStream.IsEnabled)
   {
      this.sensor.DepthStream.Disable();
   }

   // detach event handlers
   this.sensor.SkeletonFrameReady -= this.SensorSkeletonFrameReady;

   try
   {
      this.sensor.Stop()
   }
   catch (Exception e)
   {
       Debug.WriteLine("unknown Exception {0}", e.Message)
   }
}

希望这可以帮助。

于 2013-10-04T06:19:27.550 回答