Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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. Вообще-то до внимательного ознакомления с этой книгой баловаться с потоками не советую - плохо кончится... |
|
Вернуться к началу |
|
|
|