Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрыть полностью программу 
V
    Опции темы
Loncaster
Дата 24.11.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



Вообщем есть такой фрагмент кода...

Код

if(File.Exists("settings.dat")){
                string result;
                Configurator conf = new Configurator(this);
                result = conf.ReadSettings();
                if(result=="error"){
                    MessageBox.Show("Error in reading settings. Please, reset the application");
                    this.Close();
                 
                }
                billingConnector bill = new billingConnector();
                bill.getSessionId();
                if(bill.session_exits==true){
                    bill.login(conf.login,conf.pass);
                    
                    if(bill.ballance.IndexOf("-")==0){
                        //blabla
                    }


Так вот  после окна с ошибкой, программа не завершается а идет дальше и уже выкидывает иссключение на этой строке: 
Код

if(bill.session_exits==true){


Как закрыть сразу прогу, чтобы она не шла дальше?
--------------------
Ще не вмерла Україна...
PM MAIL   Вверх
mr.DUDA
Дата 24.11.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



После this.Close добавить return;


--------------------
user posted image
PM MAIL WWW   Вверх
Loncaster
Дата 24.11.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



если добавляю return то получаю иссключение 

Код

Exception System.ObjectDisposedException was thrown in debuggee:
Cannot access a disposed object.

CreateHandle()
CreateHandle()
get_Handle()
SetVisibleCore()
SetVisibleCore()
set_Visible()
RunMessageLoopInner()
RunMessageLoop()
Run()
Main() - d:\Мои документы\SharpDevelop Projects\Billing\MainForm.cs:39,4


Если второе, то ничего не происходит, и выдается иссключение походу программы..
--------------------
Ще не вмерла Україна...
PM MAIL   Вверх
mr.DUDA
Дата 24.11.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(Loncaster @  24.11.2006,  22:16 Найти цитируемый пост)
если добавляю return то получаю иссключение

Это потому что после Close нельзя работать с формой, судя по call stack-у форма пытается стать видимой после Close.

Цитата(Loncaster @  24.11.2006,  22:16 Найти цитируемый пост)
Если второе, то ничего не происходит, и выдается иссключение походу программы..

Действительно, этот вариант не работает.

Вариант, который работает в 100% случаев:
Код
Thread.CurrentThread.Abort();


И соответственно, при желании можно его обработать в Main(), добавив try...catch(ThreadAbortException).

Добавлено @ 23:35 
Хз почему, но не при отладке всегда кидает исключение, даже если взять Application.Run (...) в try-catch. Похоже я поспешил с советом, сорри, Loncaster.


--------------------
user posted image
PM MAIL WWW   Вверх
Loncaster
Дата 24.11.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



Код

if(result=="error"){
                    MessageBox.Show("Error in reading settings. Please, reset the application");
                    this.Close();
                    Thread.CurrentThread.Abort();
                    return;
                 
                }


Код

Exception System.Threading.ThreadAbortException was thrown in debuggee:
Thread was being aborted.

Abort()
.ctor() - d:\Мои документы\SharpDevelop Projects\Billing\MainForm.cs:64,6
Main() - d:\Мои документы\SharpDevelop Projects\Billing\MainForm.cs:39,4

--------------------
Ще не вмерла Україна...
PM MAIL   Вверх
-ser-
Дата 25.11.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 4
Всего: 13



Цитата(mr.DUDA @  24.11.2006,  23:26 Найти цитируемый пост)
Вариант, который работает в 100% случаев:
Код

Thread.CurrentThread.Abort();


mr.DUDA, ну ты же сам лучше других знаешь, ибо сам здесь как-то писал что Thread.CurrentThread.Abort(); не завершает работу потока а только бросает Exeption. Ну да, ты приписал ниже ... при желании ... . Есть желание закрыть сразу.

может здесь имеет значение где исходный фрагмент кода находится, например
Цитата
Caution  
Do not call M:System.Windows.Forms.Form.Close from within an event handler for either the Load or Activated events. Both conditions can cause memory leaks. To test whether you should close a form shortly after it has loaded, use the Idle event instead.



--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
Naum
Дата 25.11.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 1
Всего: 15



Цитата(-ser- @  25.11.2006,  11:03 Найти цитируемый пост)
Caution  
Do not call M:System.Windows.Forms.Form.Close from within an event handler for either the Load or Activated events. Both conditions can cause memory leaks. To test whether you should close a form shortly after it has loaded, use the Idle event instead.

-ser-, а это во всех фрэймворках? Потому что у меня такая же проблема была, но только во втором. В первом, если не запущено дополнительных потоков. this.Close() всегда сразу закрывает приложение.

Это сообщение отредактировал(а) Naum - 25.11.2006, 11:57


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 25.11.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Close закрывает форму - равносильно выходу из приложения, если форма главная, т.е. открыта в Main, но у Loncaster-а похоже проблемы с обработчиками событий, которые генерятся по ходу закрытия формы. 90% что есть обработчик типа VisibleChanged или что-то в этом духе (фокус etc.).


--------------------
user posted image
PM MAIL WWW   Вверх
Loncaster
Дата 25.11.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



В программе есть несколько потоков, кроме главной формы. + форма использует иконку в трее, т.е. сворачивается туда и т.д. =) 

Воощем, как мне все таки решить проблему? =)
--------------------
Ще не вмерла Україна...
PM MAIL   Вверх
Bishop
Дата 25.11.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 2
Всего: 16



А Application.Exit() не подойдет?
PM WWW ICQ   Вверх
mr.DUDA
Дата 25.11.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(Loncaster @  25.11.2006,  15:37 Найти цитируемый пост)
В программе есть несколько потоков, кроме главной формы. + форма использует иконку в трее, т.е. сворачивается туда и т.д. =)

Везде где не уверен - добавь проверку на IsDisposed формы.


--------------------
user posted image
PM MAIL WWW   Вверх
Loncaster
Дата 25.11.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



Цитата(mr.DUDA @ 25.11.2006,  23:03)
Везде где не уверен - добавь проверку на IsDisposed формы.

Ниче не понял) Какую проверку, куда, зачем?)
--------------------
Ще не вмерла Україна...
PM MAIL   Вверх
mr.DUDA
Дата 25.11.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(Loncaster @  25.11.2006,  22:16 Найти цитируемый пост)
Ниче не понял) Какую проверку, куда, зачем?)

В обработчики событий, в методы которые работают с формой из другого потока, в перекрытые методы формы. В конце концов, посмотри в отладчике где валится твоё исключение

Цитата
Exception System.ObjectDisposedException was thrown in debuggee:
Cannot access a disposed object.

CreateHandle()
CreateHandle()
get_Handle()
SetVisibleCore()
SetVisibleCore()
set_Visible()
RunMessageLoopInner()
RunMessageLoop()
Run()
Main() - d:\Мои документы\SharpDevelop Projects\Billing\MainForm.cs:39,4


и если исключение генерит твой код - добавь в него проверку на IsDisposed там, где валится.


--------------------
user posted image
PM MAIL WWW   Вверх
-ser-
Дата 27.11.2006, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 4
Всего: 13



Цитата(Loncaster @  25.11.2006,  16:37 Найти цитируемый пост)
В программе есть несколько потоков, кроме главной формы


вот здесь и зарыта собака. и решение простое.

Во-первых. существует несколько способов создавать потоки. нет смысла здесь все это приводить. проверь как они создаются у тебя и в зависимости от метода, который ты используешь при их создании, почитай доку по нему. 

ну а если лень, то решается это просто.

перед закрытием формы заверши корректно потоки, либо при их создании указывай foreground = true, что означает что при закрытии основного, остальные тоже будут автоматически убиты, что не произойдет с потоками работаюшими в backgroundе, это единственное их отличие, всего лишь флаг.  


--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1397 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.