Можно ли вызывать «Application.DoEvents», пока модальное диалоговое окно прогресса запущено? - PullRequest
2 голосов
/ 11 декабря 2011

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

Поскольку диалоговое окно является модальным, пользователь не может ничего делать, кроме просмотра или отмены. Другими словами, они не могут выбирать пункт меню или нажимать какие-либо кнопки.

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

Я что-то пропускаю или выкачиваю сообщения с помощью Application.DoEventing, что законно делать с модальным диалогом вверх?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2011

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

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

0 голосов
/ 11 декабря 2011

Я не вижу особых проблем с этим ограниченным использованием DoEvents.Мы успешно используем его в очень ограниченных ситуациях, таких как эта, когда фоновая обработка невозможна.

...