在VS2012中,Leap Listener控制器在一段时间后停止工作

时间:2013-09-03 06:47:36

标签: c#-4.0 leap-motion

我们在Windows桌面的VS Express 2012中集成了Flash窗体应用程序(crazytaxi.swf)。我们使用leapmotion控制器在手势的帮助下控制游戏。

当我们在VS2012中运行项目时,游戏正常启动。我们使用手势(左,右等)玩游戏。但是经过一段时间后控制器通过退出其线程停止侦听。我们可以在输出窗口中看到。 “线程''(0x1b50)已经退出,代码为0(0x0)。”我们进入输出窗口。

我们没有得到如何克服这一挑战。

3 个答案:

答案 0 :(得分:1)

您没有提供足够的信息,但从我收集的信息来看,您的LEAP线程已经完成并关闭。如果在函数中声明并初始化侦听器和控制器变量,并且在执行函数时变量超出范围,则会发生这种情况。这会导致垃圾收集器将控制器和侦听器都置于可能看似随机(不可再现)的时刻。要解决此问题,请为控制器和侦听器创建一个单例 - 这可以简化为在某个类中定义静态控制器和侦听器变量。这样,侦听器和控制器对象将永远不会超出范围并由GC处理。

答案 1 :(得分:0)

“线程''(0x1b50)退出时代码为0(0x0)基本上表示:

ID为6992的线程已成功运行并完成操作。

System Error Codes (0-499)

enter image description here

问题是,设备是否停止跟踪?

以下是我的Leap Motion应用程序的0x0(工作正常):

线程'vshost.NotifyLoad'(0x364)已退出,代码为0(0x0)。 线程''(0x3348)已退出,代码为0(0x0)。 线程'vshost.LoadReference'(0x37c8)已退出,代码为0(0x0)。

另外,在旁注中,因为它与错误代码无关 - 您是从控制器中删除侦听器,然后在应用程序关闭时将它们都处理掉?不妥善处理物体会导致问题。

第二个注释 - onExit和onDisconnet是两回事。

<强> onDisconnect(控制器:控制器):无效 当Controller对象与Leap Motion软件断开连接时调用。 听者

<强>的OnExit(控制器:控制器):无效 从Controller中删除此Listener对象或销毁Controller实例时调用。

如果有人遇到类似的问题,请查看代码后我通过电子邮件发送的回复:

我查看了代码,因为你只给了我一些文件,我必须注释掉那些没有包含在zip中的类的引用。

使用3种不同的Leap Motion设备可以很好地运行代码 - 当我从方法中注释掉时,我的建议是:

  1. 更新SDK。我使用.Net 4 dll和最新版本的SDK,现在是:v.1.0.8.7665

  2. 完成使用后,请处置对象。使用它们后处理帧,从Controller中删除侦听器,并在不再使用设备或关闭应用程序时处置Controller。

  3. 我注意到他们正在创建一些Timers和DispatcherTimers,但我找不到任何关于它们被使用的位置的引用。这些用于什么? DispatcherTimer不属于Windows窗体应用程序。

  4. 我最好的猜测 - 我讨厌猜测 - 是存在线程问题,或者对象没有正确处理 - 或者您使用的是具有错误的SDK版本。

    我在GitHub上有两个应用程序 - 随意使用你想要的代码。 WPF有一个,Windows Forms有一个 - 需要更新最新的SDK,因为在SDK的更高版本中有些东西已被弃用(例如Screen类)。

    WPF: https://github.com/IrisClasson/Leap-Motion

    Windows窗体: https://github.com/IrisClasson/LeapMotion_WinForms_Demo_OLD_SDK

    免责声明:如果有任何WinForms开发,我做的不多。

答案 2 :(得分:0)

我的WPF应用程序和Leap Motion代码存在同样的问题,但代码在控制台应用程序中运行良好。

在WPF中,当我全局声明Leap-Listener和控制器Object时,我不再面对错误,并且Listener始终处于活动状态。

只需在您调用侦听器的类(全局)中声明侦听器和控制器

  

public static LeapListener listener;

public static Controller controller;

现在使用此侦听器对象,并将其添加到控制器并在函数或构造函数中启用控制器的手势属性。

listener = new LeapListener();
controller.AddListener(listener);
controller = new Controller();

这应该可以解决问题。如果问题仍然存在(检测问题),只需初始化并将相同的侦听器对象添加到控制器对象onExit事件。现在,手势和其他属性存在,因为您没有再次创建控制器的新实例。