Re[3]: MessageBox.Show отправляет главную форму на задний пл
От: _Eter_ http://mnazarov.ru
Дата: 28.07.10 15:31
Оценка:
Здравствуйте, sVenom, Вы писали:

V>Я и так показываю MessageBox из основного потока. Проясню некоторые детали. Представте себе главную форму с несколькими кнопками, выполняющие раличные операции, причем эти операции взаимоисключающие, т.е. когда выполняется одна, никакие другие выполняться не должны. Эти "тяжелые" операции выполняются в главном потоке, соответственно пока это происходит главное окно кажется пользователю "подвисшим". Что бы сделать интерфейс более дружественным было решено вызывать в новом потоке форму, на которой будет ProgressBar, а главный поток будет периодически репортить о прогрессе операции. Приведенный мною способ вызова дополнительной формы — единственно мне известный. Поясню:

V>1) Если вызывать дополнительную форму методом new Form(...).Show(), то оно будет не живой, так как отсутствует цикл обработки сообщений.
V>2) Если я попытаюсь вызвать дочернюю форму из основного потока методом Application.Run(), то поток подиснет, ибо цикл обработки сообщений бесконечный.
V>Соответственно единственный выход сделать так, что бы новая форма была "живой", а основной поток не останавливался — новая форма в новом потоке черех Application.Run(), как у меня и сделано.
V>В принципе это работало без проблем до тех пор, пока мне не потребовалось выдавать диалоговое окно по завершении длительной операции. Что было раньше:
V>ОП — основной поток, ДП — дополнительный поток

V>1. ОП выполняется и периодически извещает ДП о прогрессе

V>2. После заврешения операции ОП вызывает CloseForm() на объекте ProgressForm ДП
V>3. Происходит уничтожение ProgressForm, цикл обработки оконных сообщений завершается, ДП умирает
V>4. ОП вызывает метод MessageBox.Show() что бы уведомить пользователя о завершении.

V>Так вот, если выкинуть последний шаг, то все Ок. Если же он присутствует, то после того, как я кликну на Ок месседж-бокса, то есть когда я выйду из 4-го шага, форма теряет выделение и отправляется на самый задний план Windows.

V>Как с этим бороться?

Такие "тяжелые" операции обычно выполняются на отдельном потоке, а в основном отображается форма с прогрессом
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.