Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Немедленно завершить работу приложения


Страницы:   1 2

qwerty2 ©   (2003-01-09 12:20:00) 

Использую блок try .. except для подсоединения к базе данных. В блоке except (то есть когда не удалось соединиться) выдаю соответственное сообщение после чего пишу Application.Terminate; Однако программа продолжает выполняться!


OlDemon   (2003-01-10 09:53:00) [1]

Конечно хальт это ненормально. Как всякие там готу и пр. Это мне еще моя учительница по программированию на паскале в школе вдолбила. Это и есть пресловутый стиль (уровень) программиста. Если есть другой вариант надо пользоваться им. Хальт для крайних случаев.


Alx2   (2003-01-10 09:52:00) [2]

Вопрос, скорее, просто перешел в русло "как работает 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


Delirium^.Tremens   (2003-01-10 09:29:00) [3]

ALL>>
Я никогда не пойму людей, которые прочитав в инструкции к холодильнику, что его не рекомендуется выдергивать из розетки при включенном компрессоре, именно так его и выключают, утверждая при этом, что уже много лет так делают и ничего. Казалось бы, что еще нужно, в Delphi Help написано, что это abnormal, люди, стоявшие (и продолжающие стоять) у истоков Delphi и видевшие на доске надпись Button.Caption := "Ok"(Тейксейра и Пачеко), говорят, что Halt - ненормальное завершение программы... Нет всегда найдется умник, который пытается доказать, что он правее. Кто такие Delphi Help и Тейксейра с Пачеко мы знаем, а кто ТЫ такой, умник, чтобы тебя слушать? Ну нравится тебе Halt, пользуйся на здоровье, но не надо выставлять себя здесь истиной в первой инстанции.


False_Delirium   (2003-01-09 18:43:00) [4]

2Dimka Maslov
Здорово, клёво-то как, бесподобно... и к чему это..??..

А всё, помимо того, что высвобождается в finalization где будет высвобождено..?..

Halt всегда было и остаётся аварийным завершением...


Dimka Maslov   (2003-01-09 18:35:00) [5]

>Zemal
Once a unit’s initialization code starts to execute, the corresponding finalization section is guaranteedto 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.


Запусти проект и нажми на кнопку. Здорово, правда? Сам пургу гонишь.


Verg   (2003-01-09 18:34:00) [6]

А я тебе что показывал??

Вот ту программку-то и попробуй. Этот файл, который она создает, после завершение программки удаляется влегкую.
А дело тут в том, что:

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;


False_Delirium   (2003-01-09 18:32:00) [7]

2Delirium
"За ресурсами, следит операционная система, а не приложение. Как только процесс прекратил своё существование, память какую он занимал, передаётся другим задачам. "

Утечка памяти - это так, для запугивания начинающих программистов придумано..?.. Можно ничего не высвобождать, по окончанию программы всё сделает ОС..?..


Zemal   (2003-01-09 18:18:00) [8]

Verg © >> Вот ты открой файл для записи, а потом Halt-ни и попробуй удалить... при первой попытке точно выскачит ошибка :).


Zemal   (2003-01-09 18:03:00) [9]

Блин, ну вы и ... завернули непоймёшь что!!! Какие там initialization и finalization???!!! При использовании Halt ничего небудет высвобождено!!! Даже формы не разрушатся!!! Dimka Maslov проверь и увидишь что ничего небудет высвобождено!!! Что ты пургу-то гонишь???!!! После Halt вообще ничего небудет выполнено, т.к. у приложения отнимается доступ ко времени процессора и оно вообще снимается из списка задачь!!! Что же по твоему после Halt-а высвободит ресурсы??? Святой Дух что-ли???
Verg >> по твоему ты FileCreate-ом захватываешь ресурс??? Это ты только создаёшь объект, а не открываешь файл для эксклюзивного использования...


Dimka Maslov   (2003-01-09 17:44:00) [10]

>Zemal
Если приложение держит открытым ресурс (например файл), то если ЯВНО этот ресурс не освобождается, то неважно каким методом приложение будет заверешено - ресурс освобожден не будет.
Ресурсы, выделенные в секциях initialization и освобождаемые в секциях finalization модулей будут освобождены, поскольку секции finalization всех модулей выполняются независимо от способа завершения программы.


Verg   (2003-01-09 16:39:00) [11]


> Если приложение, к примеру, держит открытым какой-то ресурс,
> например файл (!!!), то операционка его НЕВЫСВОБОДИТ!!!
>



procedure TForm1.Button1Click(Sender: TObject);
var F : file;
begin
FileCreate("c:\0\test.fli");
ShowMessage("Попробуй удалить c:\0\test.fli");
Halt(0);
end;


Как демаешь, Zemal ©, можно будет удалить файл?


Zemal   (2003-01-09 15:58:00) [12]

И до чего же все такие ленивые и безолаберные, что уже лень писать стало "Application.Terminate; Abort;". Совсем обленились :). Всё больше вижу склонности к "жестоким" методам типа Halt. :) ГЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ :)


Zemal   (2003-01-09 15:52:00) [13]

Ей! Ёу! Брэйк! Halt всем хорошь, конечно! НО!!! Если приложение, к примеру, держит открытым какой-то ресурс, например файл (!!!), то операционка его НЕВЫСВОБОДИТ!!! Чего вы спорите-то???!!! Оперативку Винда освободит, конечно, а вот захваченные ресурсы ОСТАНУТСЯ ЗАХВАЧЕННЫМИ!!! И хрен его знает смогут ли эти ресурсы в дальнейшем использоваться! Вот чем вашь Halt плох!!! :)


Verg   (2003-01-09 15:11:00) [14]

Все зависит от реализации halt.

1. ExitProcess;
2. TerminateProcess;

ExitProcess ничего особо страшного для системы не сделает. Для логики работы собственно программы, разве что (например, если не сделать до Exit-а FreeLibrary для всех LoadLibrary).

TerminateProcess - этот "нагадить" может только DLL-кам со статической привязкой к процессу (у них не будет вызван метод DLL_PROCESS_DETACH DllMain).


Но, по-моему, в дельфях halt сделан "по-мягкому" - ExitProcess


Delirium^.Tremens   (2003-01-09 14:51:00) [15]

Delirium © (09.01.03 14:37)

Я и не утверждал, что операционка этого не сделает. Просто, для выхода из дома, можно спуститься на лифте, а можно спрыгнуть с балкона. Городские службы (операционка) уберут за тобой, да и задача будет выполнена. Но, лично я - лучше на лифте.

Dok_3D © (09.01.03 14:43)

...Метод Halt(), напротив, прекращает выполнение приложения немедленно, не возвращаясь из метода. При этом не происходит корректного освобождения захваченных приложением ресурсов (не считая освобождения самой операционной системой)...


Dok_3D   (2003-01-09 14:43:00) [16]

2 Delirium^.Tremens

Книги у меня этой нет. И, думаю, мало у кого она есть.
Если других источников нет, то, пожалуйста, копирни пару фраз на экран по данному вопросу.
Ну очень хочется увидеть первоисточник.


Delirium   (2003-01-09 14:37:00) [17]

"что ресурсы, захваченные программой корректно не освобождаются при таком подходе" - бред. За ресурсами, следит операционная система, а не приложение. Как только процесс прекратил своё существование, память какую он занимал, передаётся другим задачам.


Delirium^.Tremens   (2003-01-09 14:33:00) [18]

Borland Delphi 4. Руководство разработчика
Пачеко К., Тейксейра С. стр.120


Dok_3D   (2003-01-09 14:24:00) [19]

2 Delirium^.Tremens
>> захваченные программой корректно не освобождаются при таком
>> подходе

Ну ты прямо меня заинтриговал ...
Если несложно, дай пожалуйста немного более раскрытое обоснование этого заявления (MSDN, Delphi Help или что-то в этом роде).


Delirium^.Tremens   (2003-01-09 13:57:00) [20]

Dimka Maslov © (09.01.03 13:54)
Не важно что завершает без вопросов, а важно, что ресурсы, захваченные программой корректно не освобождаются при таком подходе. Так что: Application.Terminate; + abort; (для процедуры)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо