Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
Старик   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
2-1153044436
raincrossbow
2006-07-16 14:07
2006.08.06
Как прикомпилить к проге весь runtime?


1-1150976550
wipr
2006-06-22 15:42
2006.08.06
Можно ли оживить QuickReport в Delphi 2006


15-1152294495
palva
2006-07-07 21:48
2006.08.06
Сильвио Берлускони предстанет перед судом


15-1152267147
sniknik
2006-07-07 14:12
2006.08.06
Как все похоже... хотя вроде бы про другое ;) (возможно баян!!!)


2-1153383069
Levin_610
2006-07-20 12:11
2006.08.06
командная строка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский