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

Вниз

Различные варианты выгрузки приложения из памяти   Найти похожие ветки 

 
Старик   (2006-06-22 14:34) [0]

Вопрос такой: способов выгрузить приложения из памяти больше одного. Мне известны:
Application.Terminate;
PostQuitMessage;
MainFormOfApplication.Close;
Halt;
Просьба вкратце изложить основные различия всех этих способов.

Сам я, поскольку не знаю, где тут грабли лежат, пользуюсь другим способом:
В главной форме прописываю процедуру OnMessage(var Handled : boolean; var Msg : TMsg) и назначаю ее обработчиком для Application.OnMessage.
В этой процедуре я отслеживаю Windows-сообщения и, если пришло сообщение для закрытия окна, то начинаю сворачивать свое приложение:
1. Уничтожаю все данные - массивы, списки и пр.
2. Удаляю объекты из памяти, зануляю указатели на них.
3. Если в приложении больше одной формы, то проверяю, созданы ли они, и если да, то аналогичным образом уничтожаю их.
Насколько корректно это решение с точки зрения грамотности исполнения?


 
tesseract ©   (2006-06-22 14:43) [1]


> Halt;


Это не выход, это убийство.


 
StriderMan ©   (2006-06-22 14:45) [2]


> 1. Уничтожаю все данные - массивы, списки и пр.

зачем? они и так уничтожатся

> 2. Удаляю объекты из памяти, зануляю указатели на них.

аналогично

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

то же


 
begin...end ©   (2006-06-22 14:58) [3]

> Старик   (22.06.06 14:34) [0]

> Application.Terminate;
> PostQuitMessage;
> MainFormOfApplication.Close;
> Halt;
> Просьба вкратце изложить основные различия всех этих способов.

Первые три способа инициируют завершение программы одним и тем же путём -- посылкой WM_QUIT (PostQuitMessage).

В последнем способе вызывается ExitProcess.

--------------------
Sorry, I"m drunk now


 
TUser ©   (2006-06-22 15:04) [4]

Можно еще TerminateProcess


 
Старик   (2006-06-22 15:27) [5]

tesseract:
если нетрудно, растолкуйте пожалуйста, в чем тонкости убийства и для чего оно нужно? В хелпе говорится только то, что эта процедура "ненормально завершает процесс".

StriderMan:
Да, я знаю, что оно там само все подчистится :) Это у меня еще с 98-й винды паранойя осталась - насколько я знаю, там глюк был - при завершении работы программ бывало так, что программа вроде бы и исчезла, но память осталась занятой.

begin...end:
Спасибо, я понял.
Тогда получается, что вполне достаточно будет просто сделать в главной форме при нажатии на кнопку Application.Terminate, а все остальное просто излишне?


 
tesseract ©   (2006-06-22 15:36) [6]


> если нетрудно, растолкуйте пожалуйста, в чем тонкости убийства
> и для чего оно нужно? В хелпе говорится только то, что эта
> процедура "ненормально завершает процесс".

точно уничтожает на фиг. Без деинициализации всех занятых дескрипторов/памяти и др. NT покорректней выходит, а в 98 немерянная утечка памяти.


> зачем? они и так уничтожатся

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


 
StriderMan ©   (2006-06-22 16:06) [7]


> чистить за собой обязательно

я думаю только если используются какие-то shared буферы памяти.


 
tesseract ©   (2006-06-22 16:23) [8]


> я думаю только если используются какие-то shared буферы
> памяти.


В любом случае нужно.



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

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

Наверх




Память: 0.49 MB
Время: 0.04 c
9-1132413694
4ECHOK
2005-11-19 18:21
2006.08.06
Равномерное расположение N точек в ограниченной области.


2-1153077301
dj0n
2006-07-16 23:15
2006.08.06
Как открыть доступ на таблицу InterBase!


15-1152699427
qwe777
2006-07-12 14:17
2006.08.06
Тока поступил и все говорят САБЖ. Что то такое?


3-1149058635
AGGRESSOR
2006-05-31 10:57
2006.08.06
Как программно изменить текст запроса Access?


2-1152689581
Mamed
2006-07-12 11:33
2006.08.06
Osvejit ekran