我们在Windows桌面的VS Express 2012中集成了Flash窗体应用程序(crazytaxi.swf)。我们使用leapmotion控制器在手势的帮助下控制游戏。
当我们在VS2012中运行项目时,游戏正常启动。我们使用手势(左,右等)玩游戏。但是经过一段时间后控制器通过退出其线程停止侦听。我们可以在输出窗口中看到。 “线程''(0x1b50)已经退出,代码为0(0x0)。”我们进入输出窗口。
我们没有得到如何克服这一挑战。
答案 0 :(得分:1)
您没有提供足够的信息,但从我收集的信息来看,您的LEAP线程已经完成并关闭。如果在函数中声明并初始化侦听器和控制器变量,并且在执行函数时变量超出范围,则会发生这种情况。这会导致垃圾收集器将控制器和侦听器都置于可能看似随机(不可再现)的时刻。要解决此问题,请为控制器和侦听器创建一个单例 - 这可以简化为在某个类中定义静态控制器和侦听器变量。这样,侦听器和控制器对象将永远不会超出范围并由GC处理。
答案 1 :(得分:0)
“线程''(0x1b50)退出时代码为0(0x0)基本上表示:
ID为6992的线程已成功运行并完成操作。
问题是,设备是否停止跟踪?
以下是我的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设备可以很好地运行代码 - 当我从方法中注释掉时,我的建议是:
更新SDK。我使用.Net 4 dll和最新版本的SDK,现在是:v.1.0.8.7665
完成使用后,请处置对象。使用它们后处理帧,从Controller中删除侦听器,并在不再使用设备或关闭应用程序时处置Controller。
我注意到他们正在创建一些Timers和DispatcherTimers,但我找不到任何关于它们被使用的位置的引用。这些用于什么? DispatcherTimer不属于Windows窗体应用程序。
我最好的猜测 - 我讨厌猜测 - 是存在线程问题,或者对象没有正确处理 - 或者您使用的是具有错误的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事件。现在,手势和其他属性存在,因为您没有再次创建控制器的新实例。