如何在窗口关闭时完全停止所有Kinect流和功能?

时间:2013-10-03 18:51:40

标签: c# wpf kinect kinect-sdk

我一直在玩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()上,我不知道为什么。我的大部分代码都是直接来自他们的例子,所以我不知道为什么这不起作用。如果您有任何想法,或希望我发布更多代码,请不要犹豫。

1 个答案:

答案 0 :(得分: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)
   }
}

希望这会有所帮助。