0

У меня очень трудное время для отладки/исправления приложения.Почему приложение WinMobile (Compact Framework) висит после фотографии?

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

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

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

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

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

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

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

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

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

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

while(UserNotFinished) 
{ 
    Application.DoEvents() 
} 

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

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

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

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

+0

Если вы используете Win32 в течение года, как бы вы достигли эффекта, который вы пытаетесь получить с помощью цикла DoEvent? Вы бы назвали «GetMessage» и «DispatchMessage» в цикле (вот что вы здесь делаете)? Я предполагаю, что ты этого не сделаешь. Попробуйте взглянуть на нее с точки зрения вашего опыта Win32. – ctacke

+0

ОК, спасибо. Я скопировал какой-то (плохой) код из интернетов ... моя первая ошибка. – Tim

ответ

0

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

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

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

в то время как (true) { DoEvents() }

в основной теме не работает.

+0

DoEvents() в основном потоке не работает, потому что это ваш основной поток, который висит. В противном случае приложение сможет выполнить DoEvents() самостоятельно. Я бы посмотрел на обработчики событий, которые могли бы повесить ваш основной поток с чем-то вроде обработки фотографии. – ytg

+2

О, и, насколько я знаю, вызов DoEvents() считается злым. – ytg

+1

Да, DoEvents() плохо. Это оставлено плохой практикой программирования у программистов VB. В основном он говорит: «Я не знаю, что делать или что я делаю». – jp2code

1

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