Текущий архив: 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