Контроллер Leap Listener перестает работать через некоторое время в VS2012

Мы интегрировали флеш-игру (crazytaxi.swf) в приложение формы Windows в VS Express 2012 для рабочего стола Windows. Мы управляем игрой с помощью жестов с помощью контроллера jumpmotion.

Что происходит, когда мы запускаем проект в VS2012, игра запускается нормально. Мы играем в игру, используя жесты (влево, вправо и т. д.). Но через некоторое время контроллер перестает слушать, выходя из своего потока. Мы можем видеть это в окне вывода. «Поток (0x1b50) завершился с кодом 0 (0x0)». это мы получаем в окне вывода.

Мы не понимаем, как преодолеть эту проблему.


person Vaibhav    schedule 03.09.2013    source источник
comment
В классе jumpListener мы написали код как общедоступное переопределение void OnExit(Controller cntrlr) { Console.WriteLine(Exited); если (cntrlr.IsConnected) cntrlr.AddListener (новый LeapListener()); еще новый контроллер (). AddListener (новый LeapListener ()); } Мы сделали это, потому что слушатель завершает работу между ними. Таким образом, мы добавляем новый слушатель после выхода. После добавления нового слушателя он переходит к методу onframe. Но никакие жесты не распознаются.   -  person Vaibhav    schedule 03.09.2013


Ответы (3)


Вы не предоставили достаточно информации, но из того, что я понял, ваша ветка LEAP завершилась и закрылась. Это может произойти, если вы объявляете и инициализируете свои переменные прослушивателя и контроллера в функции, и переменные выходят за пределы области видимости при выполнении функции. Это приводит к тому, что сборщик мусора удаляет и контроллер, и прослушиватель в моменты, которые могут показаться случайными (не воспроизводимыми). Чтобы решить эту проблему, создайте синглтон для контроллера и слушателя — это может сводиться к простому определению статического контроллера и переменных слушателя в некотором классе. Таким образом, объекты прослушивателя и контроллера никогда не выйдут из области видимости и не будут удалены сборщиком мусора.

person Bartosz    schedule 09.02.2014

«Поток» (0x1b50) завершился с кодом 0 (0x0) в основном говорит, что:

Поток с идентификатором 6992 запустился и успешно завершил операцию.

Коды системных ошибок (0- 499)

введите здесь описание изображения

Вопрос, устройство перестало отслеживать?

Вот мои 0x0 из моего приложения Leap Motion (оно работает нормально):

Поток vshost.NotifyLoad (0x364) завершился с кодом 0 (0x0). Поток '' (0x3348) завершился с кодом 0 (0x0). Поток vshost.LoadReference (0x37c8) завершился с кодом 0 (0x0).

Кроме того, кстати, поскольку это не имеет никакого отношения к коду ошибки, вы удаляете прослушиватель из контроллера, а затем избавляетесь от них обоих, когда приложение закрывается? Неправильная утилизация объектов вызовет проблемы.

Второе примечание: onExit и onDisconnet — это две разные вещи.

onDisconnect(controller:Controller):void Вызывается, когда объект Controller отключается от программного обеспечения Leap Motion. Слушатель

onExit(controller:Controller):void Вызывается, когда этот объект прослушивателя удаляется из контроллера или экземпляр контроллера уничтожается.

На случай, если у кого-то возникнут подобные проблемы, вот ответ, который я отправил по электронной почте после просмотра кода:

Я просмотрел код, так как вы прислали мне только несколько файлов, мне пришлось закомментировать ссылки на классы, которые не были включены в zip.

Код отлично работает с 3 различными устройствами Leap Motion - когда я комментирую метод, я предлагаю следующее:

  1. Обновите SDK. Я использовал .Net 4 dll и последнюю версию SDK, которая на сегодняшний день: v.1.0.8.7665.

  2. Избавьтесь от объектов, как только вы закончите их использовать. Удаление кадров после их использования, удаление прослушивателя из контроллера и удаление контроллера, когда устройство больше не используется или приложение закрывается.

  3. Я заметил некоторые таймеры и DispatcherTimers, которые создавались, но я не смог найти никаких ссылок на то, где они использовались. Для чего они используются? DispatcherTimer не относится к приложению Windows Forms.

Мое лучшее предположение — и я ненавижу догадываться — заключается в том, что существует проблема с потоками ИЛИ объекты не размещаются правильно — ИЛИ вы используете версию SDK с ошибками.

У меня есть два приложения на GitHub — не стесняйтесь использовать код по своему усмотрению. Существует один для WPF и один для Windows Forms — оба должны быть обновлены для последней версии SDK, поскольку некоторые вещи устарели (например, класс Screen) в более поздних версиях SDK.

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

Windows Forms: https://github.com/IrisClasson/LeapMotion_WinForms_Demo_OLD_SDK

Отказ от ответственности: я мало что делаю, если какая-либо разработка WinForms

person Iris Classon    schedule 04.09.2013
comment
Да, контроллер движения Leap перестает отслеживать, когда соответствующий поток выходит. Я тоже отправил вам письмо. - person Vaibhav; 05.09.2013
comment
Причина, по которой Leap Motion перестает отслеживать, скорее всего, в коде, без кода я вам ничем помочь не могу. Разместите здесь свой код. Просто догадываться, что не так, без исключений, трассировки стека или кода — не лучший способ решить проблемы. Работает ли пример, поставляемый с SDK? - Если он сравнит его с вашим кодом и увидит, чем он отличается. Вставьте сюда свой код. - person Iris Classon; 05.09.2013

У меня была такая же проблема с моим приложением WPF и кодом Leap Motion, но код отлично работает с консольным приложением.

В WPF, когда я глобально объявил Leap-Listener и объект контроллера, я больше не сталкивался с ошибкой, и Listener активен все время.

Просто объявите слушателя и контроллер в классе (глобально), из которого вы вызываете слушателя

общедоступный статический слушатель LeapListener;

public static Controller controller;

Теперь используйте этот объект прослушивателя, добавьте его в контроллер и включите свойство жестов контроллера в функции или конструкторе.

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

Это должно решить проблему. Если проблема все еще сохраняется (проблема обнаружения), просто инициализируйте и добавьте тот же объект слушателя к событию onExit объекта контроллера. Теперь жест и другие свойства существуют, поскольку вы не создаете новый экземпляр контроллера снова.

person Aditya Alle    schedule 16.10.2013