Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2009, 13:38   #1
zonclayv
Пользователь
 
Регистрация: 22.12.2008
Сообщений: 13
По умолчанию Использование Оп.памяти программами

Помогите плз
Необходимо определить сколько оперативной памяти используют запущеные программы.

Есть код (он находит все запущеные программы), а как определить сколько оп.памяти они используют, подскажите плз
Цитата:
procedure TForm1.Button1Click(Sender: TObject);
var
wnd: hwnd;
buff: array [0..127] of char;
begin
ListBox1.clear;
wnd := getwindow(handle, gw_hwndfirst);
while wnd <> 0 do
begin // Не показываем:
if (wnd <> application.handle) // Собственное окно
and iswindowvisible(wnd) // Невидимые окна
and (getwindow(wnd, gw_owner) = 0) // Дочерние окна
and (getwindowtext(wnd, buff, sizeof(buff)) <> 0) then
begin
getwindowtext(wnd, buff, sizeof(buff));
ListBox1.items.add(strpas(buff));
end;
wnd := getwindow(wnd, gw_hwndnext);
end;
ListBox1.itemindex := 0;
end;

Последний раз редактировалось zonclayv; 03.04.2009 в 14:25.
zonclayv вне форума Ответить с цитированием
Старый 03.04.2009, 17:55   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

самое простое это использовать функцию GlobalMemoryStatus. Поле dwMemoryLoad задаёт процент использования памяти. Количество используемой памяти можно определить вычев из общего количества оперативной памяти количество свободной (dwTotalPhys-dwAvailPhys), но нельзя забывать что суммарное количество используемой памяти может быть больше чем количество оперативной. Тогда количество памяти используемой программами будет вычисляться по формуле dwTotalVirtual-dwAvailVirtual
rpy3uH вне форума Ответить с цитированием
Старый 03.04.2009, 20:23   #3
zonclayv
Пользователь
 
Регистрация: 22.12.2008
Сообщений: 13
По умолчанию

rpy3uH, биг тебе спосибо
Ещё один вопрос: Как определить сколько использует оп. памяти каждая запущенная программа?
zonclayv вне форума Ответить с цитированием
Старый 03.04.2009, 20:40   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

это уже сложнее
надо юзать функцию NtQuerySystemInformation c флагом SYSTEM_PROCESS_INFORMATION
rpy3uH вне форума Ответить с цитированием
Старый 03.04.2009, 21:18   #5
zonclayv
Пользователь
 
Регистрация: 22.12.2008
Сообщений: 13
По умолчанию

а поподробней можно?
zonclayv вне форума Ответить с цитированием
Старый 04.04.2009, 17:18   #6
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

GetProcessMemoryInfo
Это функцие имхо проще будет. Как это сделать через NtQuerySystemInformation - не понимаю. Там ведь дается только оффсет на следующий элемент, а базового адреса в структуре нет, короче бред какой то.. а может отталкиваться нужно от нуля?
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 05.04.2009, 15:37   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

В данном случае конечно лучше юзать GetProcessMemoryInfo
NtQuerySystemInformation универсальная функция и все API функции для получения статистики в итоге обращаются к ней и её подобным. (GetProcessMemoryInfo обращается к ZwQueryInformationProcess)

Последний раз редактировалось rpy3uH; 05.04.2009 в 15:40.
rpy3uH вне форума Ответить с цитированием
Старый 05.04.2009, 21:00   #8
zonclayv
Пользователь
 
Регистрация: 22.12.2008
Сообщений: 13
По умолчанию

Подскажите плз, хоть в кратце, как воспользоваться функцией GetProcessMemoryInfo в данном случае.
zonclayv вне форума Ответить с цитированием
Старый 05.04.2009, 21:05   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

пример использования функции из MSDN
Код:
#include <windows.h>
#include <stdio.h>
#include <psapi.h>

void PrintMemoryInfo( DWORD processID )
{
    HANDLE hProcess;
    PROCESS_MEMORY_COUNTERS pmc;

    // Print the process identifier.

    printf( "\nProcess ID: %u\n", processID );

    // Print information about the memory usage of the process.

    hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, processID );
    if (NULL == hProcess)
        return;

    if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
    {
        printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
        printf( "\tPeakWorkingSetSize: 0x%08X\n", 
                  pmc.PeakWorkingSetSize );
        printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
        printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPeakPagedPoolUsage );
        printf( "\tQuotaPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPagedPoolUsage );
        printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPeakNonPagedPoolUsage );
        printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaNonPagedPoolUsage );
        printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage ); 
        printf( "\tPeakPagefileUsage: 0x%08X\n", 
                  pmc.PeakPagefileUsage );
    }

    CloseHandle( hProcess );
}

int main( )
{
    // Get the list of process identifiers.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return 1;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the memory usage for each process

    for ( i = 0; i < cProcesses; i++ )
        PrintMemoryInfo( aProcesses[i] );

	return 0;
}
В Delphi надо
Код:
uses ...., psapi;
дальше аналогично вышеприведённому примеру

Последний раз редактировалось rpy3uH; 05.04.2009 в 21:08.
rpy3uH вне форума Ответить с цитированием
Старый 05.04.2009, 21:23   #10
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

rpy3uH, а можно аналогичный пример для NtQuerySystemInformation? Я попытался сделать вот такую структуру для этой функции:
Код:
struc SYSTEM_PROCESS_INFORMATION 
{
 	NextEntryOffset dd ?
    Reserved1 rb 52
    Reserved2 rd 3
    UniqueProcessId dd ?
    Reserved3 dd ?
    HandleCount dd ?
    Reserved rb 4
    Reserved5 rd 11
    PeakPagefileUsage dd ?
    PrivatePageCount dd ?
    Reserved6 rq 6   
}
;AF bytes
Но мне кажется что она неправильная. Ну и не совсем понятно как этой функцией пользоваться для поставленной задачи. Из всех параметров только оффсет на следующий процесс(?) и ID процесса. За точку отсчета тогда что нужно брать?
PS: Попробовал помочь и самому стало интересно
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчёт количества памяти занимаемого программами zonclayv Win Api 0 19.03.2009 22:03
Управление другими программами L_M Общие вопросы Delphi 4 04.05.2008 02:53
работа с чужими программами Rend1 Win Api 31 02.03.2008 16:42
Работа с другими программами kurazh77 Общие вопросы Delphi 6 09.10.2007 22:07