![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Различные варианты выгрузки приложения из памяти [D6, Win2k, WinXP]
Старик © (2006-06-22 14:34:00)Вопрос такой: способов выгрузить приложения из памяти больше одного. Мне известны:
Application.Terminate;
PostQuitMessage;
MainFormOfApplication.Close;
Halt;
Просьба вкратце изложить основные различия всех этих способов.
Сам я, поскольку не знаю, где тут грабли лежат, пользуюсь другим способом:
В главной форме прописываю процедуру OnMessage(var Handled : boolean; var Msg : TMsg) и назначаю ее обработчиком для Application.OnMessage.
В этой процедуре я отслеживаю Windows-сообщения и, если пришло сообщение для закрытия окна, то начинаю сворачивать свое приложение:
1. Уничтожаю все данные - массивы, списки и пр.
2. Удаляю объекты из памяти, зануляю указатели на них.
3. Если в приложении больше одной формы, то проверяю, созданы ли они, и если да, то аналогичным образом уничтожаю их.
Насколько корректно это решение с точки зрения грамотности исполнения?
tesseract (2006-06-22 16:23:00) [1]
> я думаю только если используются какие-то shared буферы
> памяти.
В любом случае нужно.
StriderMan (2006-06-22 16:06:00) [2]
> чистить за собой обязательно
я думаю только если используются какие-то shared буферы памяти.
tesseract (2006-06-22 15:36:00) [3]
> если нетрудно, растолкуйте пожалуйста, в чем тонкости убийства
> и для чего оно нужно? В хелпе говорится только то, что эта
> процедура "ненормально завершает процесс".
точно уничтожает на фиг. Без деинициализации всех занятых дескрипторов/памяти и др. NT покорректней выходит, а в 98 немерянная утечка памяти.
> зачем? они и так уничтожатся
чистить за собой обязательно. Ой не факт, что утечки системной памяти не будет, особенно при вызове внешних библиотек, создании хэндлов и тд.
Старик (2006-06-22 15:27:00) [4]tesseract:
если нетрудно, растолкуйте пожалуйста, в чем тонкости убийства и для чего оно нужно? В хелпе говорится только то, что эта процедура "ненормально завершает процесс".
StriderMan:
Да, я знаю, что оно там само все подчистится :) Это у меня еще с 98-й винды паранойя осталась - насколько я знаю, там глюк был - при завершении работы программ бывало так, что программа вроде бы и исчезла, но память осталась занятой.
begin...end:
Спасибо, я понял.
Тогда получается, что вполне достаточно будет просто сделать в главной форме при нажатии на кнопку Application.Terminate, а все остальное просто излишне?
TUser (2006-06-22 15:04:00) [5]Можно еще TerminateProcess
begin...end (2006-06-22 14:58:00) [6]> Старик (22.06.06 14:34) [0]
> Application.Terminate;
> PostQuitMessage;
> MainFormOfApplication.Close;
> Halt;
> Просьба вкратце изложить основные различия всех этих способов.
Первые три способа инициируют завершение программы одним и тем же путём -- посылкой WM_QUIT (PostQuitMessage).
В последнем способе вызывается ExitProcess.
--------------------
Sorry, I'm drunk now
StriderMan (2006-06-22 14:45:00) [7]
> 1. Уничтожаю все данные - массивы, списки и пр.
зачем? они и так уничтожатся
> 2. Удаляю объекты из памяти, зануляю указатели на них.
аналогично
> Если в приложении больше одной формы, то проверяю, созданы
> ли они, и если да, то аналогичным образом уничтожаю их.
> Насколько корректно это решение с точки зрения грамотности
> исполнения?
то же
tesseract (2006-06-22 14:43:00) [8]
> Halt;
Это не выход, это убийство.