Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

ЛЮДИ ПОМОГИТЕ!!! ПЛИЗ!!!! ВОПРОС ПО ОСВОБОЖДЕНИЮ ПАМЯТИ!!!

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
monster
Гость





СообщениеДобавлено: Пт Сен 27 2002 14:28    Заголовок сообщения: ЛЮДИ ПОМОГИТЕ!!! ПЛИЗ!!!! ВОПРОС ПО ОСВОБОЖДЕНИЮ ПАМЯТИ!!! Ответить с цитатой

Была написана программа на Delphi!!!
Она запускается под WinNT!!

Создаётся процесс (запускается прог-ма через [ShelEvecuteEx]), потом этот процесс грохается Terminate procces, в результате память не освоюождается. После нескольких подобных процедур, выдаётся сообщение о нехватки памяти и происходит зависание!!!

Вот код этой проги:
// Запуск проги

procedure TForm1.RunCalliseum();
begin
ExecuteFile:='D:\Calliseum\callman.exe'.. SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpFile := PChar(ExecuteFile);
nShow := SW_SHOWNORMAL;
end;
if ShellExecuteEx(@SEInfo) then begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.. ExitCode);
until (ExitCode STILL_ACTIVE) or Application.Terminated;
end
else ShowMessage('Error starting Calliseum!');
end;

..
// Процесс терминэйтится и опять запускается
TerminateProcess(SEInfo.hProcess, ExitCode);
RunCalliseum();

Мне дали 2 совета:
1-Может есть смысл запускать программу из отдельно созданного потока (CreateThread), который ты можешь в любой момент корректно завершить.
2-Каждый процесс имеет Handle процесса. При выделении памяти по запросу процесса создается Handle объекта под названием "память". Handle памяти - это индекс в таблице памяти. В записи (строке) этой таблицы содержится информация о Handle процесса, запросившего память, указатель на начало этой памяти, объем выделенной памяти. При аварийном (принудительном) завершении процесса запись в таблице выделенной памяти остается, а процесса с таким Handle уже нет. Доступ к этой таблице возможен ТОЛЬКО из режима ядра ОС. Вывод - подчистить таблицу можно только имея код, работающий в режиме ядра (например драйвер).

Подскажите, пожалуйста, как реализовать один из двух данных мне советов, или где можно найти инфу по их реализации!!!
Заранее благодарен!!!
Monster!!!
Вернуться к началу
Andy_user
Гость





СообщениеДобавлено: Пт Сен 27 2002 15:42    Заголовок сообщения: Уточните пожалуйста.. Ответить с цитатой

Уточните пожалуйста, какую задачу Вы решаете:
Вариант 1. Принудительно завершить ЛЮБОЙ (не Ваш) процесс таким образом, чтобы вся память, которую использовал завершаемый процесс, вернулась в систему (то есть не происходила утечка памяти);
Вариант 2. Принудительно завершить Вами созданную и запущенную программу , чтобы не происходила утечка памяти.
Вернуться к началу
monster
Гость





СообщениеДобавлено: Пт Сен 27 2002 16:15    Заголовок сообщения: Re: Уточните пожалуйста.. Ответить с цитатой

Мне нужно:Принудительно завершить, процесс запущенный из моей программы , таким образом, чтобы вся память, которую использовал завершаемый процесс, вернулась в систему (то есть не происходила утечка памяти
Вернуться к началу
Andy_user
Гость





СообщениеДобавлено: Пт Сен 27 2002 16:36    Заголовок сообщения: Примерно так... Ответить с цитатой

- Процесс, который Вы хотите завершить, должен собрать список всех дескрипторов памяти (Handle);
- Затем создать отдельный поток (лучше средствами API), которому передать указатель на этот список;
- Этот поток должен сидеть и ждать заранее определенную команду, которую он должен получить при помощи средств межпроцессного взаимодействия;
- При поступлении команды ("сообщения" в терминологии Windows) освободить всю память из списка и завершить процесс;
- Для посылки заранее определенной команды необходимо создать еще одну программу.

Да еще, в дополнительном потоке не используйте визуальные средства, только Windows API.
Вернуться к началу
Коллега
Гость





СообщениеДобавлено: Пн Сен 30 2002 10:44    Заголовок сообщения: Re: Примерно так... Ответить с цитатой

Есть еще один момент - рекомендуется
в случаях, когда вы используете функции
стандартной библиотеки C, пользоваться
функциями _beginthreadex, _endthreadex,
а не CreateThread, ExitThread. Дело в том,
что в этом случае ваша программа создаст
доп. указатели на используемые структуры,
которые при выходе не освободит.
Кроме того, как справедливо заметил коллега
Andy_user, Terminate - не лучший способ завер-
шения потока, воспользуйтесь его советом -
созданием контроллирующей очереди сообщений
и функцией PostThreadMessage для отсылки сообщения, которое позволит завершить функцию потока и корректно освободить ресурсы.
Литература: Джеффри Рихтер, Windows для профессионалов, 2001, Microsoft Press.
Вернуться к началу
monster
Гость





СообщениеДобавлено: Пн Сен 30 2002 13:40    Заголовок сообщения: Re: Примерно так... Ответить с цитатой

А можно поподробнее, пожалуйтса, а то я нифига не понял из ваших научных терминов!!!!
Пожалуйста!!!
Или хотя бы скажите, где можно почитать документацию по тому материалу, который вы привели!!!
Вернуться к началу
monster
Гость





СообщениеДобавлено: Пн Сен 30 2002 13:40    Заголовок сообщения: Re: Примерно так... Ответить с цитатой

А можно поподробнее, пожалуйтса, а то я нифига не понял из ваших научных терминов!!!!
Пожалуйста!!!
Или хотя бы скажите, где можно почитать документацию по тому материалу, который вы привели!!!
Вернуться к началу
monster
Гость





СообщениеДобавлено: Пн Сен 30 2002 13:41    Заголовок сообщения: Re: Примерно так... Ответить с цитатой

А можно поподробнее, пожалуйтса, а то я нифига не понял из ваших научных терминов!!!!
Пожалуйста!!!
Или хотя бы скажите, где можно почитать документацию по тому материалу, который вы привели!!!
Вернуться к началу
Коллега
Гость





СообщениеДобавлено: Пн Сен 30 2002 21:15    Заголовок сообщения: Re: Примерно так... Ответить с цитатой

Я уже написал - читайте Джеффри Рихтера.
Такое толстое зеленое издание.
Главы 6-12.
Вообще-то до внимательного ознакомления
с этой книгой баловаться с потоками не советую - плохо кончится...
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...