Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить ресурсы (память затребованная программой)  (Прочитано 14380 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlexisKoz
Гость
« : 09-07-2003 14:37 » 

Приветствую.
Я тестирую на низком уровне в Дельфи (т.е. пишу фактически unit-тесты).
И возникла задача узнать, сколько памяти поело работающее приложение.
Решение использовать тулзы типа SleuthQA хорошее, но мне кажется это делается парой строчек.
Я использовал функцию GlobalMemoryStatus и смотрел, как изменяется количество доступной. Но это "не наш метод".
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 09-07-2003 14:45 » 

Это вообще не метод...
Насколько мне известно - посчитать память используемую твоей аппликацией - может только сама она сама запрашивая у себя чего где она есть и суммируя.

А считать разницу по показателям системы некорректно, так как сама система постоянно жива и память то отъедается то возвращается...
Записан

А птичку нашу прошу не обижать!!!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 09-07-2003 15:06 » 

Вот играйся
GetHeapStatus
AllocMemSize
по идее должны работать!
Записан

Странно всё это....
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 09-07-2003 15:08 » 

LogRus, по моему это не совсем то - но ссылочки не помешают Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
AlexisKoz
Гость
« Ответ #4 : 09-07-2003 15:08 » 

Отлично, спасибы...хоть оказалось надо было писать в тему по Делфи, сорри...
А в VC как будет, отцы?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 09-07-2003 15:12 » 

AlexisKoz, нет ты же и VC хочешь узнать...

Кстати API функции должны быть теже... это API Не понял
LogRus, так это функции   Отлично
Записан

А птичку нашу прошу не обижать!!!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 09-07-2003 15:18 » 

Вот я по тестил оказалось как и написанно в доке
AllocMemSize возвращает тоже значение что и поле THeapStatus.TotalAllocated возвращаемое GetHeapStatus и пре вызове AllocMem(size) значения возвращаемые этими функциями увеличиваются на size. вот и плюс это функции API я их в в модуле system нашел и как следствие в VC должно быть также!
Записан

Странно всё это....
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 09-07-2003 15:27 » 

Вот код которым я тестил.
Код:

procedure TForm1.Button1Click)Sender{ TObject:;
var i{LongInt;
    V{THeapStatus;
begin
 i{=AllocMemSize;
 i{=i div 1024;
 Memo1.Lines.Clear;
 Memo1.Lines.Add)'AllocMemSize='+IntToStr)i:+'kb':;
 V{=GetHeapStatus;
 i{=V.TotalAddrSpace;
 i{=i div 1024;
 Memo1.Lines.Add)'TotalAddrSpace='+IntToStr)i:+'kb':;
 i{=V.TotalUncommitted;
 i{=i div 1024;
 Memo1.Lines.Add)'TotalUncommitted='+IntToStr)i:+'kb':;
 i{=V.TotalCommitted;
 i{=i div 1024;
 Memo1.Lines.Add)'TotalCommitted='+IntToStr)i:+'kb':;
 i{=V.TotalAllocated;
 i{=i div 1024;
 Memo1.Lines.Add)'TotalAllocated='+IntToStr)i:+'kb':;
 i{=V.TotalFree;
 i{=i div 1024;
 Memo1.Lines.Add)'TotalFree='+IntToStr)i:+'kb':;
 i{=V.FreeSmall;
 i{=i div 1024;
 Memo1.Lines.Add)'FreeSmall='+IntToStr)i:+'kb':;
 i{=V.FreeBig;
 i{=i div 1024;
 Memo1.Lines.Add)'FreeBig='+IntToStr)i:+'kb':;
 i{=V.Unused;
 i{=i div 1024;
 Memo1.Lines.Add)'Unused='+IntToStr)i:+'kb':;
 i{=V.Overhead;
 i{=i div 1024;
 Memo1.Lines.Add)'Overhead='+IntToStr)i:+'kb':;
 i{=V.HeapErrorCode;
 i{=i div 1024;
 Memo1.Lines.Add)'HeapErrorCode='+IntToStr)i:+'kb':;

end;

procedure TForm1.Button2Click)Sender{ TObject:;
var p{pointer;
begin
P{=AllocMem)4096:;
end;
Записан

Странно всё это....
AlexisKoz
Гость
« Ответ #8 : 09-07-2003 15:34 » 

Спасибо еще раз, буду пользоваться!
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 09-07-2003 19:55 » 

Еще можно воспользоваться ф-цией ZwQueryInformationProcess (она же NtQueryInformationProcess), описание ф-ции можно найти в книге Garry Nebbett "Windows NT/2000 Native API Reference"( книга есть на этом сайте). Ф-ция экспортируется из ntdll.dll.
Можно получить следующую инфу о любом процессе в системе(перед этим открыв его handle функцией OpenProcess)-
Например информационная структура ProcessVmCounters дает следующую инфу-
1. Пиковые и текущие размеры занимаемыми процессом в файлах подкачки.
2. Пиковый и текущий размер рабочего набора процесса.
3. Количество выделенной памяти в пулах ядра(максимальный и текущий)
И много другой информации. Для исследования других прог очень полезная ф-ция, так как позволяет получить много информации о процесее- память, число открытых handle, приоритеты процесса, квоты, время создания и много другого- смотри структуру PROCESSINFOCLASS.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 09-07-2003 20:01 » 

Спасибо я запомню на будующее! Хотя не уверен что понадобится. Собираюсь по писать под линь а там НТ'ей нет! Жжешь
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines