Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так
StartWindow(); //Запускаем окно
StartMove(); //Функция переноса
StopWindow(); //Закрытие окна
Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.
Окно отображения хода длительных операций
От:
Аноним
Дата:
17.08.06 13:10
Оценка:
Я вижу два варианта решения,
первый — окно НЕ модальное, тогда:
Form f = new Form();
f.Show(); //Запускаем окно
StartMove(); //Функция переноса
f.Close(); //Закрытие окна
Мне непонятно, почему вы настаиваете, чтобы окно было именно модальным — объясните.
второй, окно модальное и код длительной операции запускается из события Activate у модальной формы.
Здравствуйте, mishazhutov, Вы писали:
M>Я вижу два варианта решения, M>первый — окно НЕ модальное, тогда:
M>Form f = new Form(); M>f.Show(); //Запускаем окно
M>StartMove(); //Функция переноса
M>f.Close(); //Закрытие окна
M>Мне непонятно, почему вы настаиваете, чтобы окно было именно модальным — объясните.
Я думаю для того чтобы нельзя было инициировать какую нибудь другую операцию.
M>второй, окно модальное и код длительной операции запускается из события Activate у модальной формы.
У вас ответы противоречат друг другу.
Смотрите, вы говорите — "Я думаю для того чтобы нельзя было инициировать какую нибудь другую операцию.
" — это означает, что длительная операция должна запускаться в том же потоке. Длительные операции для того и запускают в другом потоке, чтобы можно было еще что то запустить.
Дальше, вы говорите — "Получаеться что длительная операция будет выполняться в потоке формы?" — а тут вы хотите запускать длительную операцию уже в другом потоке.
Где логика? В каком потоке должна выполняться длительная операция?
Здравствуйте, mishazhutov, Вы писали:
M>У вас ответы противоречат друг другу. M>Смотрите, вы говорите — "Я думаю для того чтобы нельзя было инициировать какую нибудь другую операцию. M>" — это означает, что длительная операция должна запускаться в том же потоке. Длительные операции для того и запускают в другом потоке, чтобы можно было еще что то запустить.
Это означает что модальное окно должно блокировать доступ к форме с которой можно инициировать длительные операции которые выполняються в других потоках.
M>Дальше, вы говорите — "Получаеться что длительная операция будет выполняться в потоке формы?" — а тут вы хотите запускать длительную операцию уже в другом потоке. M>Где логика? В каком потоке должна выполняться длительная операция?
Здравствуйте, 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>ссылка на оригинальное сообщение
Здравствуйте, <Аноним>, Вы писали:
А>Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так А>StartWindow(); //Запускаем окно А>StartMove(); //Функция переноса А>StopWindow(); //Закрытие окна
А>Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.
>Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так >StartWindow(); //Запускаем окно >StartMove(); //Функция переноса >StopWindow(); //Закрытие окна
>Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.
Если отображать окно в другом потоке, то в этом другом потоке должен быть вызван Application.Run. Но, наверное, лучше использовать другой метод — выводить окно в главном потоке, а StartMove() запускать асинхронно.
Здравствуйте, Paulmay, Вы писали:
>>Вообщем такой вопрос. Модальное окно должно отображаться пока идет например перемещение файлов, после этого скрыться. Работать должно примерно так >>StartWindow(); //Запускаем окно >>StartMove(); //Функция переноса >>StopWindow(); //Закрытие окна
>>Пытаюсь отобразить окно в другом потоке, но оно почему-то не отображается и сразу переходит к переносу, после переноса все нормально закрывается. Как лучше сделать чтобы это окно отображалось? Оно должно быть модальное.
P>Если отображать окно в другом потоке, то в этом другом потоке должен быть вызван Application.Run. Но, наверное, лучше использовать другой метод — выводить окно в главном потоке, а StartMove() запускать асинхронно.
Я бы посоветовал по нажатию какой либо кнопки запустить рабочий (асинхронный) поток и:
1) Ассинхронно открыть модальное окно
2) Выполнить длительную операцию
3) Закрыть модальное окно
P>данное сообщение получено с www.gotdotnet.ru P>ссылка на оригинальное сообщение
Здравствуйте, 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 у остальных окон с прорисовкой проблемы.