Окно отображения хода длительных операций
От: Аноним  
Дата: 17.08.06 11:07
Оценка:
Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так
StartWindow(); //Запускаем окно
StartMove(); //Функция переноса
StopWindow(); //Закрытие окна

Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.
Окно отображения хода длительных операций
От: Аноним  
Дата: 17.08.06 13:10
Оценка:
Я вижу два варианта решения,
первый — окно НЕ модальное, тогда:

Form f = new Form();
f.Show(); //Запускаем окно

StartMove(); //Функция переноса

f.Close(); //Закрытие окна

Мне непонятно, почему вы настаиваете, чтобы окно было именно модальным — объясните.

второй, окно модальное и код длительной операции запускается из события Activate у модальной формы.



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Окно отображения хода длительных операций
От: Danj  
Дата: 17.08.06 13:55
Оценка:
Здравствуйте, mishazhutov, Вы писали:

M>Я вижу два варианта решения,

M>первый — окно НЕ модальное, тогда:

M>Form f = new Form();

M>f.Show(); //Запускаем окно

M>StartMove(); //Функция переноса


M>f.Close(); //Закрытие окна


M>Мне непонятно, почему вы настаиваете, чтобы окно было именно модальным — объясните.


Я думаю для того чтобы нельзя было инициировать какую нибудь другую операцию.

M>второй, окно модальное и код длительной операции запускается из события Activate у модальной формы.


Получаеться что длительная операция будет выполняться в потоке формы?

M>
данное сообщение получено с www.gotdotnet.ru

M>ссылка на оригинальное сообщение
Re: Окно отображения хода длительных операций
От: Аноним  
Дата: 17.08.06 14:15
Оценка:
У вас ответы противоречат друг другу.
Смотрите, вы говорите — "Я думаю для того чтобы нельзя было инициировать какую нибудь другую операцию.
" — это означает, что длительная операция должна запускаться в том же потоке. Длительные операции для того и запускают в другом потоке, чтобы можно было еще что то запустить.
Дальше, вы говорите — "Получаеться что длительная операция будет выполняться в потоке формы?" — а тут вы хотите запускать длительную операцию уже в другом потоке.
Где логика? В каком потоке должна выполняться длительная операция?




данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Окно отображения хода длительных операций
От: Danj  
Дата: 17.08.06 14:28
Оценка:
Здравствуйте, mishazhutov, Вы писали:

M>У вас ответы противоречат друг другу.

M>Смотрите, вы говорите — "Я думаю для того чтобы нельзя было инициировать какую нибудь другую операцию.
M>" — это означает, что длительная операция должна запускаться в том же потоке. Длительные операции для того и запускают в другом потоке, чтобы можно было еще что то запустить.

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

M>Дальше, вы говорите — "Получаеться что длительная операция будет выполняться в потоке формы?" — а тут вы хотите запускать длительную операцию уже в другом потоке.

M>Где логика? В каком потоке должна выполняться длительная операция?


M>
данное сообщение получено с www.gotdotnet.ru

M>ссылка на оригинальное сообщение
Re[2]: Окно отображения хода длительных операций
От: Аноним  
Дата: 17.08.06 14:41
Оценка:
Так в чем проблема, в модальной форме заводится переменная, например,

private bool _operationStarted;

дальше, в событии Activate у формы запускаем длительную операцию в другом потоке:

private void Form_Activate(object sender, EventArgs args)
{
if(!operationStarted)
{
operationStarted = true;
// run operation in another thread here
}
}



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Окно отображения хода длительных операций
От: Danj  
Дата: 17.08.06 14:51
Оценка:
Здравствуйте, mishazhutov, Вы писали:

M>Так в чем проблема, в модальной форме заводится переменная, например,


M>private bool _operationStarted;


M>дальше, в событии Activate у формы запускаем длительную операцию в другом потоке:


M>private void Form_Activate(object sender, EventArgs args)

M>{
M> if(!operationStarted)
M> {
M> operationStarted = true;
M> // run operation in another thread here
M> }
M>}

Да здесь я свами полностью согласен, единственное что запуск длительных операций не входит в задачи сплеша.

M>
данное сообщение получено с www.gotdotnet.ru

M>ссылка на оригинальное сообщение
Re: Окно отображения хода длительных операций
От: stasukas  
Дата: 17.08.06 16:17
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так

А>StartWindow(); //Запускаем окно
А>StartMove(); //Функция переноса
А>StopWindow(); //Закрытие окна

А>Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.


См. пример в этой статье: Safe, Simple Multithreading in Windows Forms, Part 2
... << RSDN@Home 1.2.0 alpha rev. 653>>
C:\>DUMP StateOf(My.Brain) >> http://www.usecase.ru/
Окно отображения хода длительных операций
От: Аноним  
Дата: 17.08.06 17:12
Оценка:
>Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так
>StartWindow(); //Запускаем окно
>StartMove(); //Функция переноса
>StopWindow(); //Закрытие окна

>Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.


Если отображать окно в другом потоке, то в этом другом потоке должен быть вызван Application.Run. Но, наверное, лучше использовать другой метод — выводить окно в главном потоке, а StartMove() запускать асинхронно.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Окно отображения хода длительных операций
От: Danj  
Дата: 18.08.06 07:40
Оценка:
Здравствуйте, Paulmay, Вы писали:

>>Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так

>>StartWindow(); //Запускаем окно
>>StartMove(); //Функция переноса
>>StopWindow(); //Закрытие окна

>>Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.


P>Если отображать окно в другом потоке, то в этом другом потоке должен быть вызван Application.Run. Но, наверное, лучше использовать другой метод — выводить окно в главном потоке, а StartMove() запускать асинхронно.


Я бы посоветовал по нажатию какой либо кнопки запустить рабочий (асинхронный) поток и:
1) Ассинхронно открыть модальное окно
2) Выполнить длительную операцию
3) Закрыть модальное окно

P>
данное сообщение получено с www.gotdotnet.ru

P>ссылка на оригинальное сообщение
Re[2]: Окно отображения хода длительных операций
От: cmisha  
Дата: 21.08.06 10:58
Оценка:
Здравствуйте, Danj, Вы писали:

D>Здравствуйте, Paulmay, Вы писали:


>>>Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так

>>>StartWindow(); //Запускаем окно
>>>StartMove(); //Функция переноса
>>>StopWindow(); //Закрытие окна

>>>Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.


P>>Если отображать окно в другом потоке, то в этом другом потоке должен быть вызван Application.Run. Но, наверное, лучше использовать другой метод — выводить окно в главном потоке, а StartMove() запускать асинхронно.


D>Я бы посоветовал по нажатию какой либо кнопки запустить рабочий (асинхронный) поток и:

D>1) Ассинхронно открыть модальное окно
D>2) Выполнить длительную операцию
D>3) Закрыть модальное окно

P>>
данное сообщение получено с www.gotdotnet.ru

P>>ссылка на оригинальное сообщение


Вот именно. Я так и хочу сделать, но не получается. Если запускаем модальное окно так ShowDialog(this), (чтобы родителем было основное окно), тогда длительная операция начинается, а окна нет! Если просто ShowDialog, тогда запускается, но не блокирует доступ к другим окнам (где длительная операция) и кроме splash'a у остальных окон с прорисовкой проблемы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.