Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2013, 16:47   #1
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию Закрытие модальной формы в другом потоке

Добрый день. Опишу суть проблемы:
Как можно закрыть форму, открытую вот таким образом? Форма создается для того, чтобы во время длительной операции отобразить некую анимацию (не спрашивайте, почему я не обрабатываю данные в отдельном потоке)
Код:
private void StartThread()
{
    NewForm form = new NewForm();
    form.ShowDialog();
}

private void button1_Click(object sender, EventArgs e)
{
    Thread newThread = new Thread(StartThread);
    newThread.Start();
}
Пытался вызывать newThread.Abort(), но после нескольких запусков, бывает, вылетают исключения, связанные с прорисовкой интерфейса.
Нашел лишь 1 стабильный, но кривой выход - стартовать таймер в фоновой форме, внутри которого отслеживать изменение некоторой глобальной переменной, при изменении которой вызывать this.Close().
Есть еще идеи?
m9yt вне форума Ответить с цитированием
Старый 19.04.2013, 16:53   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

в потоке создавать ГУИ - плохо.
eval вне форума Ответить с цитированием
Старый 19.04.2013, 16:55   #3
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию

Знаю, но проблема все еще актуальна.
m9yt вне форума Ответить с цитированием
Старый 19.04.2013, 16:59   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Да где тут проблема? в конце потоковой процедуры (ну или когда оно надо), закрыли и дело с концом
eval вне форума Ответить с цитированием
Старый 19.04.2013, 18:09   #5
stalsoft
Форумчанин
 
Регистрация: 09.06.2011
Сообщений: 147
По умолчанию

Только форма с анимацией уже и не надо) Так как главная форма уже "висеть" не будет, лучше информировать юзера об ожидании по другому (описал ниже)

Код:
private void button2_Click(object sender, EventArgs e)
        {
            //Открываем форму с анимацией, ИЛИ можно на этой же форме поставить курсор типа ЧАСЫ + 
            //выводить прогресс бар, или писать на лейбле "подождите пожалуйста, идет загрузка..."
            Form2 form = new Form2();
            form.Show();

            //Новый поток....
            ThreadPool.QueueUserWorkItem((object o) => 
            {
                //вычисление всего возможного.......
                //Искусственная пауза, которая имитирует вычисление данных
                Thread.Sleep(5000);

                //Закрываем форму в том же потоке, где и открывали...ИЛИ прячем прогресс бар и убираем текст у лейблы...
                this.Invoke(new MethodInvoker(() => 
                {
                    form.Close(); 
                }));
            });
        }
У женщин чары образуются из стрингов;
А у программистов наоборот - стринги образуются из чаров;
stalsoft вне форума Ответить с цитированием
Старый 19.04.2013, 18:35   #6
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию

stalsoft,

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

Последний раз редактировалось m9yt; 19.04.2013 в 18:38.
m9yt вне форума Ответить с цитированием
Старый 19.04.2013, 18:37   #7
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
Да где тут проблема? в конце потоковой процедуры (ну или когда оно надо), закрыли и дело с концом
Потоковых процедур нет, просто вызывается ShowDialog(). Каким образом я закрою его, если у меня тупо ничего не выполняется и нет условия выхода.
m9yt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ или создание объекта в другом потоке Maks1978 Общие вопросы C/C++ 0 04.10.2012 13:51
Уничтожение модальной формы AndreyK Общие вопросы Delphi 3 15.03.2011 01:24
Как вернуть немодальное значение из модальной формы theYozh Общие вопросы Delphi 3 31.01.2011 14:48
Как приостаносить поток до события в другом потоке Sionus Помощь студентам 2 30.03.2010 21:51
Проблема при использовании модальной формы a1ias Помощь студентам 10 14.11.2008 17:29