Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.09;
Скачать: CL | DM;

Вниз

Проблема при закрытии программы   Найти похожие ветки 

 
И. Павел ©   (2010-10-11 15:08) [0]

Здравствуйте.

Например, программа работает с БД через ADOConnection и ADOCommand. Если сразу после ADOCommand.Execute поставить ExitProcess(1), то изменения в БД не вносятся (!!!). Если до ExitProcess(1) поставить sleep(1000), то вносятся. Так что, насколько я понял, ExitProcess(1) далек от идеального способа закрытия программы, т.к. просто "сбивает"  программу со всеми ее потоками и не дает нормально завершиться ADO-провайдеру.

Подскажите, пожалуйста, как правильно закрывать программу? Например в Application.OnException или просто в OnShow или любом другом методе?
Желательно, чтобы способ был универсальный для всего Application.Run (вне Run использую Halt, и при ошибке он тоже автоматически вызывается).
Как закрываете программу вы?

Пока думаю перейти на Applicatrion.MainForm.Close (и если есть OnCloseQuery, то сделать какой-то флаг безусловного закрытия). Это правильно?

И еще вопрос: можно ли сказать, что первый Application.CreateForm(...) в приложении будет определять главнцю форму, при закрытии которой через Applicatrion.MainForm.Close закроется приложение? Просто если много своего написать в .bpr файле, то в опциях проекта исчезает MainForm, но вроде-бы она все равно есть.

PS: извиняюсь, что в какой-то степени повторяю свой предыдущий вопрос, но просто выбранный там вариант (ExitProcess(1)) оказался глючным, и я хочу уже наконец узнать, как правильно завершат приложение (в случае ошибки, в OnShow ну и вообще везде).

Заранее спасибо.


 
Юрий Зотов ©   (2010-10-11 15:50) [1]

Application.MainForm.Close - лучший вариант.
Можно и так: Application.Terminate

> можно ли сказать, что первый Application.CreateForm(...) в приложении
> будет определять главнцю форму, при закрытии которой через
> Applicatrion.MainForm.Close закроется приложение?

Да.


 
han_malign   (2010-10-11 15:50) [2]

PostQuitMessage


 
И. Павел ©   (2010-10-11 16:00) [3]

> [1] Юрий Зотов ©   (11.10.10 15:50)

Большое спасибо. Так и буду делать.


> [2] han_malign   (11.10.10 15:50)

Спасибо. Насколько я понимаю, PostQuitMessage это почти тот де Application.Terminate.


 
Игорь Шевченко ©   (2010-10-11 17:16) [4]

ставь Halt


 
_Юрий   (2010-10-11 23:28) [5]

это должно зависеть от того, что именно надо сделать
плавно закрыться, или сорваться. Иной раз уже не до плавного закрытия


 
_Юрий   (2010-10-11 23:30) [6]

Если дело происходит при инициализации приложения - так тады однозначно halt


 
Германн ©   (2010-10-12 03:19) [7]


> Игорь Шевченко ©   (11.10.10 17:16) [4]
>
> ставь Halt
>

Хоть бы смайлик поставил. Блин. :)
Не понимаю я тебя, Игорь.


 
И. Павел ©   (2010-10-12 08:25) [8]

Игорь Шевченко ©, _Юрий, Германн ©

Спасибо. В том то и дело, что даже в случае ошибки программы, и перехвата этой ошибки в Application.OnException и завершения программы, я хочу, чтобы те действия, которые были выполнены до ошибки, успешно завершились. В частности - работа с БД. Поэтому, думаю, буду использовать Close + ключ, который будет показывать, что программа закрывается по ошибке и не нужно проверять OnCloseQuery и выполнять какие-то дейстивя в OnClose;

А до Run (точнее до первого Application.CreateForm), конечно, буду использовать Halt.

Halt в OnShow приводит к ошибке.

Хотя сейчас я попробовал Application.Terminate (его я использовал раньше) - деструкторы прекрасно вызвались (где-то в сети я читал, что они при Terminate не вызываются). Так что, видимо, можно и его использовать, т.к. при разрушении ADOConnection наверняка до конца выполнятся все операции с провайдером.


 
Плохиш ©   (2010-10-12 10:27) [9]


> А до Run (точнее до первого Application.CreateForm), конечно,
>  буду использовать Halt.

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

Советую ещё раз продумать алгоритм, а то какой-то глюкодерьмокод в [0] описан.


 
Игорь Шевченко ©   (2010-10-12 10:30) [10]

Плохиш ©   (12.10.10 10:27) [9]


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


не всегда она завершится удачно. при использовании ряда компонентов она завершится с AV или Runtime error 217


 
Плохиш ©   (2010-10-12 10:45) [11]


> Игорь Шевченко ©   (12.10.10 10:30) [10]

Это уже второй вопрос. Когда возникнет, тогда и будем на него отвечать ;-)


 
han_malign   (2010-10-12 13:04) [12]


> где-то в сети я читал, что они при Terminate не вызываются

- это при /(Exit|Terminate)(Process|Thread)/, а PostQuitMessage - все делает "честно"...

Halt() - это по сути ExitProcess() - но еще вызывается код "финализации" модулей и выгружаются библиотеки...



Страницы: 1 вся ветка

Текущий архив: 2011.01.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1287143619
Первокурсница
2010-10-15 15:53
2011.01.09
Параметры ADOQuery,обнаружены символы за пределами инструкции SQL


11-1227534671
Валера
2008-11-24 16:51
2011.01.09
Не могу найти подходящий компонент


3-1250949947
Yurikon
2009-08-22 18:05
2011.01.09
Изменение записи из другого приложения


2-1287351196
Германн
2010-10-18 01:33
2011.01.09
Caption на кнопках ToolBar


2-1286912340
v_a_belousov
2010-10-12 23:39
2011.01.09
Получить все объекты на форме