C#, диалоговое окно "подождите" и фоновая работа при этом.
От: Михаил Орлов  
Дата: 28.05.03 18:30
Оценка:
Цель: при обработке большого количества файлов показывать диалоговое окно с надписью "подождите...", не дающее юзеру доступа к основному окну программы.
Метод реализации: Форма-диалог в конструкторе принимает делегат. Сама запускается так:
Form p = new FrmNotify(<делегат>);
p.ShowDialog(this);
p.Dispose();

Внутри себя запускает делегат и потом делает Hide(); при реакции на событие о Visibility change (!). Все остальные события, кажется, не то. При этом всё появляется и работает, но диалог не является диалогом, если можно так сказать . При выборе в таскбаре кнопки основного окна его заголовок становится как у активного, а у диалога — "серым", неактивным. (а должен просто мигать заголовок диалога). При этом кнопки основного окна на нажатия не реагируют (DoEvents() вызывается работающей функцией постоянно). Как-то практически очевидно , что проблема в методе вызова делегата из диалога.
Вопрос: Как действительно реализовывать подобное?

23.12.03 16:46: Перенесено модератором из '.NET' — AVK
Re: C#, диалоговое окно "подождите" и фоновая работа при это
От: mihailik Украина  
Дата: 29.05.03 12:50
Оценка:
МО>Внутри себя запускает делегат и потом делает Hide(); при реакции на событие о Visibility change (!). Все остальные события, кажется, не то.

Ну и путаница! Какое-то Hide, и ещё Visibility change

В твоём случае (обработка файлов) имеет смысл делегат запускать при помощи BeginInvoke в асинхронном режиме. Делать это можно ещё до ShowDialog, например в конструкторе диалога. При завершении асинхронного делегата делай Close диалогу.

В асинхронном режиме не нужны никакие Application.DoEvents, так как обработка идёт в отдельном потоке. Правда, для отображения сообщений о прогрессе придётся немножко манипулировать с Form.Invoke. Потому, что нельзя обращаться к форме или контролам напрямую из другого потока.
... << RSDN@Home 1.0 beta 7a >>
Re: C#, диалоговое окно "подождите" и фоновая работа при это
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.03 00:30
Оценка:
Здравствуйте, Михаил Орлов, Вы писали:

МО>Цель: при обработке большого количества файлов показывать диалоговое окно с надписью "подождите...", не дающее юзеру доступа к основному окну программы.

...
МО>Вопрос: Как действительно реализовывать подобное?

Погляди http://rsdn.ru/article/?dotnet/regexprep_.xml
Автор(ы): Владислав Чистяков
Дата: 26.10.2002
Аннотация: Статья рассчитана на тех, кто хочет изучить программирование в .Net и язык C#, или хотя бы понять, как можно использовать эту среду, чтобы решить стоит ли этим заниматься. Эта статья также будет полезна начинающим программистам, так как позволяет пройти весь цикл разработки программы. В качестве побочного эффекта вы получите полезную утилиту.
там как раз то о чем ты говоришь организовано.
... << RSDN@Home 1.0 beta 8 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: C#, диалоговое окно "подождите" и фоновая работа при
От: Signatec Россия  
Дата: 06.06.06 04:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Погляди http://rsdn.ru/article/?dotnet/regexprep_.xml
Автор(ы): Владислав Чистяков
Дата: 26.10.2002
Аннотация: Статья рассчитана на тех, кто хочет изучить программирование в .Net и язык C#, или хотя бы понять, как можно использовать эту среду, чтобы решить стоит ли этим заниматься. Эта статья также будет полезна начинающим программистам, так как позволяет пройти весь цикл разработки программы. В качестве побочного эффекта вы получите полезную утилиту.
там как раз то о чем ты говоришь организовано.


Там диалог появляется сразу, без задержки, ведь возможно, что операция выполнится быстро и диалог просто маргнёт.
Кроме того, нет механизма для отмены операции. Обрывать поток не всегда можно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.