Форум: "Основная";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
ВнизНемедленно завершить работу приложения Найти похожие ветки
← →
qwerty2 (2003-01-09 12:20) [0]Использую блок try .. except для подсоединения к базе данных. В блоке except (то есть когда не удалось соединиться) выдаю соответственное сообщение после чего пишу Application.Terminate; Однако программа продолжает выполняться!
← →
Song (2003-01-09 12:22) [1]Ошибка в 17-ой строке
← →
Delirium^.Tremens (2003-01-09 12:22) [2]тащи сюда весь блок :-)
← →
qwerty2 (2003-01-09 12:31) [3]выглядит примерно так
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
try
Database1.Open;
except
ShowMessage("Ошибка");
Application.Terminate;
end;
Query1.Open;
выдается сообщение "Ошибка" потом вроде выполняется Application.Terminate после чего программа не завершается а пытается выполнить Query1.Open;
← →
NDeu (2003-01-09 12:34) [4]
> procedure TDataModule1.DataModuleCreate(Sender: TObject);
> begin
> try
> Database1.Open;
> except
> ShowMessage("Ошибка");
> Application.Terminate;
Exit;
> end;
> Query1.Open;
← →
Delirium^.Tremens (2003-01-09 12:34) [5]
> try
> Database1.Open;
> except
> ShowMessage("Ошибка");
> Application.Terminate;
abort;
> end;
← →
Dimka Maslov (2003-01-09 12:55) [6]Для всех кто не знает. Безоговорочное завершение программы из любого её места производится вызовом процедуры Halt. выдавать предупреждающее сообщение лучше до вызова Halt. В противном случае сообщения об ошибке вы не увидите.
← →
Delirium^.Tremens (2003-01-09 13:03) [7]
> Dimka Maslov © (09.01.03 12:55)
> Для всех кто не знает.
Для всех кто не знает, использование Halt - Initiates abnormal termination of a program, т.е. - ненормальное завершение программы.
← →
Verg (2003-01-09 13:44) [8]procedure TApplication.Terminate;
begin
if CallTerminateProcs then PostQuitMessage(0);
end;
Короче, Application.Terminate просто ставит в очеред сообщений комаду завершения и выполение процедуры продолжается.
Выход из приложения будет выполнен как только приложение вновь начнет обрабатывать сообщения из своей очереди.
← →
Dimka Maslov (2003-01-09 13:54) [9]>Delirium^...
Неважно какое termination у программы normal или abnormal, важно, при при вызове процедуры halt программа завершает работу сразу и без лишних вопросов.
← →
Delirium^.Tremens (2003-01-09 13:57) [10]Dimka Maslov © (09.01.03 13:54)
Не важно что завершает без вопросов, а важно, что ресурсы, захваченные программой корректно не освобождаются при таком подходе. Так что: Application.Terminate; + abort; (для процедуры)
← →
Dok_3D (2003-01-09 14:24) [11]2 Delirium^.Tremens
>> захваченные программой корректно не освобождаются при таком
>> подходе
Ну ты прямо меня заинтриговал ...
Если несложно, дай пожалуйста немного более раскрытое обоснование этого заявления (MSDN, Delphi Help или что-то в этом роде).
← →
Delirium^.Tremens (2003-01-09 14:33) [12]Borland Delphi 4. Руководство разработчика
Пачеко К., Тейксейра С. стр.120
← →
Delirium (2003-01-09 14:37) [13]"что ресурсы, захваченные программой корректно не освобождаются при таком подходе" - бред. За ресурсами, следит операционная система, а не приложение. Как только процесс прекратил своё существование, память какую он занимал, передаётся другим задачам.
← →
Dok_3D (2003-01-09 14:43) [14]2 Delirium^.Tremens
Книги у меня этой нет. И, думаю, мало у кого она есть.
Если других источников нет, то, пожалуйста, копирни пару фраз на экран по данному вопросу.
Ну очень хочется увидеть первоисточник.
← →
Delirium^.Tremens (2003-01-09 14:51) [15]Delirium © (09.01.03 14:37)
Я и не утверждал, что операционка этого не сделает. Просто, для выхода из дома, можно спуститься на лифте, а можно спрыгнуть с балкона. Городские службы (операционка) уберут за тобой, да и задача будет выполнена. Но, лично я - лучше на лифте.
Dok_3D © (09.01.03 14:43)
...Метод Halt(), напротив, прекращает выполнение приложения немедленно, не возвращаясь из метода. При этом не происходит корректного освобождения захваченных приложением ресурсов (не считая освобождения самой операционной системой)...
← →
Verg (2003-01-09 15:11) [16]Все зависит от реализации halt.
1. ExitProcess;
2. TerminateProcess;
ExitProcess ничего особо страшного для системы не сделает. Для логики работы собственно программы, разве что (например, если не сделать до Exit-а FreeLibrary для всех LoadLibrary).
TerminateProcess - этот "нагадить" может только DLL-кам со статической привязкой к процессу (у них не будет вызван метод DLL_PROCESS_DETACH DllMain).
Но, по-моему, в дельфях halt сделан "по-мягкому" - ExitProcess
← →
Zemal (2003-01-09 15:52) [17]Ей! Ёу! Брэйк! Halt всем хорошь, конечно! НО!!! Если приложение, к примеру, держит открытым какой-то ресурс, например файл (!!!), то операционка его НЕВЫСВОБОДИТ!!! Чего вы спорите-то???!!! Оперативку Винда освободит, конечно, а вот захваченные ресурсы ОСТАНУТСЯ ЗАХВАЧЕННЫМИ!!! И хрен его знает смогут ли эти ресурсы в дальнейшем использоваться! Вот чем вашь Halt плох!!! :)
← →
Zemal (2003-01-09 15:58) [18]И до чего же все такие ленивые и безолаберные, что уже лень писать стало "Application.Terminate; Abort;". Совсем обленились :). Всё больше вижу склонности к "жестоким" методам типа Halt. :) ГЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ :)
← →
Verg (2003-01-09 16:39) [19]
> Если приложение, к примеру, держит открытым какой-то ресурс,
> например файл (!!!), то операционка его НЕВЫСВОБОДИТ!!!
>
procedure TForm1.Button1Click(Sender: TObject);
var F : file;
begin
FileCreate("c:\0\test.fli");
ShowMessage("Попробуй удалить c:\0\test.fli");
Halt(0);
end;
Как демаешь, Zemal ©, можно будет удалить файл?
← →
Dimka Maslov (2003-01-09 17:44) [20]>Zemal
Если приложение держит открытым ресурс (например файл), то если ЯВНО этот ресурс не освобождается, то неважно каким методом приложение будет заверешено - ресурс освобожден не будет.
Ресурсы, выделенные в секциях initialization и освобождаемые в секциях finalization модулей будут освобождены, поскольку секции finalization всех модулей выполняются независимо от способа завершения программы.
← →
Zemal (2003-01-09 18:03) [21]Блин, ну вы и ... завернули непоймёшь что!!! Какие там initialization и finalization???!!! При использовании Halt ничего небудет высвобождено!!! Даже формы не разрушатся!!! Dimka Maslov проверь и увидишь что ничего небудет высвобождено!!! Что ты пургу-то гонишь???!!! После Halt вообще ничего небудет выполнено, т.к. у приложения отнимается доступ ко времени процессора и оно вообще снимается из списка задачь!!! Что же по твоему после Halt-а высвободит ресурсы??? Святой Дух что-ли???
Verg >> по твоему ты FileCreate-ом захватываешь ресурс??? Это ты только создаёшь объект, а не открываешь файл для эксклюзивного использования...
← →
Zemal (2003-01-09 18:18) [22]Verg © >> Вот ты открой файл для записи, а потом Halt-ни и попробуй удалить... при первой попытке точно выскачит ошибка :).
← →
False_Delirium (2003-01-09 18:32) [23]2Delirium
"За ресурсами, следит операционная система, а не приложение. Как только процесс прекратил своё существование, память какую он занимал, передаётся другим задачам. "
Утечка памяти - это так, для запугивания начинающих программистов придумано..?.. Можно ничего не высвобождать, по окончанию программы всё сделает ОС..?..
← →
Verg (2003-01-09 18:34) [24]А я тебе что показывал??
Вот ту программку-то и попробуй. Этот файл, который она создает, после завершение программки удаляется влегкую.
А дело тут в том, что:
Terminating a process causes the following:
1. All object handles opened by the process are closed.
2.All threads in the process terminate their execution. Each thread exits when all its pending I/O has been completed or canceled. The process exits after all its threads exit.
3.The state of the process object becomes signaled, satisfying any threads that had been waiting for the process to terminate. The process object is deleted when the last handle to the process is closed.
4.The states of all threads of the process become signaled, satisfying any threads that had been waiting for the threads to terminate.
5.The termination status of the process changes from STILL_ACTIVE to the exit value of the process.
(С)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/terminateprocess.asp
Для справки, выдержка из source sysutils.pas
function FileCreate(const FileName: string): Integer;
begin
Result := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
end;
← →
Dimka Maslov (2003-01-09 18:35) [25]>Zemal
Once a unit’s initialization code starts to execute, the corresponding finalization section is guaranteed to execute when the application shuts down
А теперь проведи небольшой тестик. Создай новый проект, на форму поставь одну кнопку. Модуль главной формы должен выглядеть так:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Halt;
end;
initialization
MessageBox(0, "initialization", "test", MB_OK);
finalization
MessageBox(0, "finalization", "test", MB_OK);
end.
Запусти проект и нажми на кнопку. Здорово, правда? Сам пургу гонишь.
← →
False_Delirium (2003-01-09 18:43) [26]2Dimka Maslov
Здорово, клёво-то как, бесподобно... и к чему это..??..
А всё, помимо того, что высвобождается в finalization где будет высвобождено..?..
Halt всегда было и остаётся аварийным завершением...
← →
Delirium^.Tremens (2003-01-10 09:29) [27]ALL>>
Я никогда не пойму людей, которые прочитав в инструкции к холодильнику, что его не рекомендуется выдергивать из розетки при включенном компрессоре, именно так его и выключают, утверждая при этом, что уже много лет так делают и ничего. Казалось бы, что еще нужно, в Delphi Help написано, что это abnormal, люди, стоявшие (и продолжающие стоять) у истоков Delphi и видевшие на доске надпись Button.Caption := "Ok" (Тейксейра и Пачеко), говорят, что Halt - ненормальное завершение программы... Нет всегда найдется умник, который пытается доказать, что он правее. Кто такие Delphi Help и Тейксейра с Пачеко мы знаем, а кто ТЫ такой, умник, чтобы тебя слушать? Ну нравится тебе Halt, пользуйся на здоровье, но не надо выставлять себя здесь истиной в первой инстанции.
← →
Alx2 (2003-01-10 09:52) [28]Вопрос, скорее, просто перешел в русло "как работает Halt"
procedure _Halt0;
var
P: procedure;
begin
{$IFDEF LINUX}
if (ExitCode <> 0) and CoreDumpEnabled then
__raise(SIGABRT);
{$ENDIF}
if InitContext.DLLInitState = 0 then
while ExitProc <> nil do
begin
@P := ExitProc;
ExitProc := nil;
P;
end;
{ If there was some kind of runtime error, alert the user }
if ErrorAddr <> nil then
begin
MakeErrorMessage;
WriteErrorMessage;
ErrorAddr := nil;
end;
{ This loop exists because we might be nested in PackageLoad calls when }
{ Halt got called. We need to unwind these contexts. }
while True do
begin
{ If we are a library, and we are starting up fine, there are no units to finalize }
if (InitContext.DLLInitState = 2) and (ExitCode = 0) then
InitContext.InitCount := 0;
{ Undo any unit initializations accomplished so far }
FinalizeUnits;
if (InitContext.DLLInitState <= 1) or (ExitCode <> 0) then
begin
if InitContext.Module <> nil then
with InitContext do
begin
UnregisterModule(Module);
{$IFDEF PC_MAPPED_EXCEPTIONS}
SysUnregisterIPLookup(Module.CodeSegStart);
{$ENDIF}
if (Module.ResInstance <> Module.Instance) and (Module.ResInstance <> 0) then
FreeLibrary(Module.ResInstance);
end;
end;
{$IFNDEF PC_MAPPED_EXCEPTIONS}
UnsetExceptionHandler;
{$ENDIF}
{$IFDEF MSWINDOWS}
if InitContext.DllInitState = 1 then
InitContext.ExitProcessTLS;
{$ENDIF}
if InitContext.DllInitState <> 0 then
ExitDll;
if InitContext.OuterContext = nil then
begin
{
If an ExitProcessProc is set, we call it. Note that at this
point the RTL is completely shutdown. The only thing this is used
for right now is the proper semantic handling of signals under Linux.
}
if Assigned(ExitProcessProc) then
ExitProcessProc;
ExitProcess(ExitCode);
end;
InitContext := InitContext.OuterContext^
end;
end;
Цитата из System.pas от D6
← →
OlDemon (2003-01-10 09:53) [29]Конечно хальт это ненормально. Как всякие там готу и пр. Это мне еще моя учительница по программированию на паскале в школе вдолбила. Это и есть пресловутый стиль (уровень) программиста. Если есть другой вариант надо пользоваться им. Хальт для крайних случаев.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.011 c