Почему приложение WinMobile (Compact Framework) зависает после того, как было сделано фото?

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

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

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

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

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

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

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

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

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

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

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

while(UserNotFinished)
{
   Application.DoEvents()
}

Где UserNotFinished - это флаг, установленный моим мастером / формами после нажатия кнопки «отправить».

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

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

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


person Tim    schedule 17.10.2011    source источник
comment
Если вы используете Win32 год, как бы вы достигли эффекта, которого пытаетесь добиться с помощью цикла DoEvent? Вы бы вызвали GetMessage и DispatchMessage в цикле (это то, что вы здесь делаете)? Я предполагаю, что вы этого не сделаете. Попробуйте взглянуть на это с точки зрения вашего опыта работы с Win32.   -  person ctacke    schedule 18.10.2011
comment
Хорошо спасибо. Я скопировал некоторый (плохой) код из Интернета ... моя первая ошибка.   -  person Tim    schedule 18.10.2011


Ответы (2)


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

person Damon8or    schedule 18.10.2011

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

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

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

while (истина) {DoEvents ()}

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

person Tim    schedule 17.10.2011
comment
DoEvents () в основном потоке не работает, потому что зависает ваш основной поток. В противном случае приложение могло бы выполнять DoEvents () самостоятельно. Я бы посмотрел на ваши обработчики событий, которые могут повесить ваш основной поток чем-то вроде обработки фотографии. - person ytg; 18.10.2011
comment
Да, и насколько мне известно, вызов DoEvents () считается злом. - person ytg; 18.10.2011
comment
Да, DoEvents () - это плохо. Это остатки плохого программирования от программистов VB. По сути, он говорит: «Я не знаю, что делать и что делаю». - person jp2code; 18.10.2011
comment
Я годами утверждал, что DoEvents не является злом или плохим по своей сути, это просто клевета со стороны тех, кто не использует его правильно. Это просто эквивалент вызова C _2 _ / _ 3_, что не вызывает проблем , если вы знаете, что он делает и почему вам следует его использовать. Просто позвонив ему ради того, чтобы я пытался синхронизировать потоки в своем приложении, это приводит к проблемам. - person ctacke; 18.10.2011
comment
Использование DoEvent () было скопировано из примера в Интернете - вероятно, это была моя первая ошибка. Мне пришлось развернуть собственный интерфейс мастера для мобильных устройств. Я попробую без него перепроектировать. - person Tim; 18.10.2011