Почему это приложение WinMobile (Compact Framework) зависает после съемки фотографии? - PullRequest
0 голосов
/ 18 октября 2011

Мне очень трудно пытаться отладить / исправить приложение.

Вкратце: - Я создал приложение типа «волшебник», которое начинается с того, что пользователь делает фотографию (используя общий диалог для фотографий)

  • Если пользователь пытаетсяиспользуйте окно ввода текста (SIP) (маленькое окно ввода с клавиатуры) после того, как фотография сделана, цикл событий, кажется, зависает - событие не обрабатывается или задерживается на некоторое время.

  • Если пользователь не делает снимок, SIP-клавиатура прекрасно работает.

  • Это происходит только на некоторых моих устройствах.В частности, это не проблема на MC65, но проблема на ES400.

Похоже, что цикл событий приложения запутался из-за способа отображения форм и фотографирования.

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

Когда я совмещаю фотосъемку с отображением моей формы ("мастером"), дела идут плохо.

Интересно, какого родацикла событий я должен работать?

По сути, пользователь делает фотографию, затем проходит через некоторые формы (я скрываю одну форму и показываю другую, когда они нажимают кнопку «Далее»).

Форма. Показ вызывается из основногоформа после того, как снимок сделан, и тогда у меня есть что-то вроде:

while(UserNotFinished)
{
   Application.DoEvents()
}

, где UserNotFinished - флаг, установленный из моего мастера / формы после нажатия кнопки "Отправить".

Я буду рад предоставить больше кода, но не уверен, что будет полезно.

Я новичок в разработке на C # и CF (много лет C ++ / Win32)

Реальная запутанная часть заключается в том, что это работает на одном устройстве, но не на другом.На самом деле устройство зависает полностью.Он завершает соединение activesync, и иногда мне приходится делать полный сброс, удаляя батарею.

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Я думаю, что ваша проблема связана с while (true) {DoEvents (); } и, возможно, как вы пытаетесь переходить между формами. Единственный раз, когда я использовал метод DoEvents (), это когда я уже нахожусь в области события Windows, и мне нужно быть уверенным, что что-то в очереди сообщений обрабатывается, чтобы обновления экрана были правильными. Я бы предложил создать класс контроллера для управления потоком экрана для вашего мастера. Вы можете управлять потоком экрана с помощью ShowDialog () и выполнять управление потоком непосредственно в области одного вызова, или вам придется использовать Show () и асинхронный механизм, такой как подписка и обработка определенной формы и элемента управления события в классе контроллера. Также вы увидели комментарий о создании другого потока, помните, что формы принадлежат тому потоку, в котором они были созданы, и вы должны вызывать (...) все члены формы в контексте создаваемого потока.

0 голосов
/ 18 октября 2011

Хм.Очень странно

Я запустил новый поток и, в основном, вызвал Application.DoEvents (), и это, похоже, решило проблему ...

Я не знаю, почему

while (true) {DoEvents ()}

в основном потоке не работает.

...