Диалог зависает при вызове из события - PullRequest
1 голос
/ 21 марта 2012

Используя драйвер CoreScanner, предоставляемый Motorola, я пытаюсь написать небольшое приложение winforms, которое использует сканер штрих-кода. Я могу нормально взаимодействовать со сканером и правильно регистрировать обратный вызов для OnBarcodeEvent (). В этом обратном вызове у меня есть диалоговое окно, которое открывает и отображает экран, который должен заполнить пользователь. Вскоре после открытия диалогового окна (с помощью Show ()) программа зависает. Если я использую ShowDialog (), диалоговое окно работает, но оно блокирует событие OnBarcodeEvent.

Мое предположение о том, что происходит, заключается в том, что, поскольку диалог создается в потоке событий, при использовании Show () возникает условие гонки. Так как Show () неблокирует, поток продолжается после отображения диалогового окна и затем умирает. Тем временем мой диалог только что потерял своего родителя и блокируется? Как я уже сказал ... моя лучшая догадка.

Как я могу исправить ситуацию? То есть, как мне написать свой диалог, чтобы он мог быть создан в потоке, а не зависать?

Ответы [ 2 ]

1 голос
/ 21 марта 2012

В этом случае вы должны запустить другую ветку, которая создаст вашу диалоговую форму и покажет форму на ней. Вам нужно заблокировать этот поток, пока форма не станет видимой - это возможно либо с помощью ShowDialog, либо поочередно использовать одну из перегрузок Application.Run .

Еще один вариант - показать форму в потоке пользовательского интерфейса (то есть в главном потоке приложения) - для этого вам нужно вызвать метод Invoke в главной форме из кода события. Вызов invoke должен принимать делегата, который покажет вашу диалоговую форму немодально.

0 голосов
/ 21 марта 2012

У меня есть некоторый опыт работы с портативными устройствами Motorola / Symbol (MC9090), и я думаю, что SDK будет похожим.

Трудно сказать, не видя код, но мои предположения:

  1. ваша общая проблема с не-пользовательским интерфейсом - поэтому убедитесь, что вы открываете диалог с помощью пользовательского интерфейса
  2. происходит сбой встроенного драйвера Motorola - без шуток, это часто случалось со мной - в моем случае (compact-framework на устройстве WinCE) это не приведет к зависанию программы, но сканер не будет работать / получать какие-либо сообщения перед перезагрузкой устройства

Чтобы исправить это, вы должны разделить отображение / обработкупользовательский диалог от события и убедитесь, что вы вызываете его в потоке пользовательского интерфейса (Control.InvokeRequired / Control.Invoke).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...