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