Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ Монитор процессов и потоков СП_правленный.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
197.12 Кб
Скачать

1.1.2 Использование функций CreateToolHelp32Snapshot () и Thread32xxxx()

для получения сведений о приоритетах потоков процессов

Для получения сведений о приоритетах потоков необходимо извлечь из снимка состояния системы с помощью функций Thread32First() и Thtead32Next () значения соответствующих полей.

Обращение к функциям имеет вид:

Thread32First (hSnapshot, LPTHREADEntry32)

Thtead32Next (hSnapshot, LPTHREADEntry32).

Первый аргумент – хэндл созданного снимка (возвращает функция CreateToolHelp32Snapshot).

Второй аргумент – структура, содержащая 7 полей:

  1. Первое поле – dwSize – размер структуры в байтах. Это единственное поле, которое должно быть заполнено до вызова функции Thread32First. Заполнить его можно, используя выражение sizeof(ThreadEntry32).

  2. Поле cntUsageth не используется и всегда устанавливается в ноль.

  3. Поле 32ThreadID – не используется и всегда устанавливается в ноль.

  4. Поле – th32OwnerProcessID – содержит идентификатор родительского процесса.

  5. Поле – tpBasePri – содержит текущий приоритет потока.

  6. Поле – tpDeltaPri – содержит разность между текущим уровнем приоритета потока и базовым уровнем, то есть тем, который присваивается при создании потока.

  7. Поле – dwFlags – не используется и всегда устанавливается в ноль.

Пример 2. Получить список выполняющихся в системе потоков, используя рассмотренные выше функции. Вывести содержимое полей 2 и 3 структуры THREADEntry32.

На форме размещены компоненты ListView, Label и Button, обработчик события OnClick имеет вид:

var

Sh: Thandle;

Th: TTHREADENTRY32;

LstIt: TlistItem;

begin

Sh:= CreateToolHelp32Snapshot(TH32CS_SNAPALL,0);

Th.dwSize:= sizeof(TTHREADEntry32);

Thread32First(sh,Th);

ListView1.Items.Clear;

LstIt:=ListView1.Items.Add;

LstIt.Caption:=IntToStr(Th.th32OwnerProcessID);

LstIt.SubItems.Add(IntToStr(Th.tpBasePri));

repeat

LstIt:=ListView1.Items.Add;

LstIt.Caption:=IntToStr(Th.th32OwnerProcessID);

LstIt.SubItems.Add(IntToStr(Th.tpBasePri))

until not Thread32Next(sh,Th);

CloseHandle(Sh);

end;

Созданы 2 Columns, имеющие заголовки «Идент процесса» и «Базовый приор потока» (свойства ListView).

ВАЖНО! Свойство ViewStyle компонента ListView должно быть установлено

в vsReport.

Результат выполнения примера 2 показан на рис. 3.

Рис. 3. Список потоков

1.1.3 Использование функций CreateToolHelp32Snapshot () и Module32xxxx()

для получения списка модулей

Для получения сведений о приоритетах потоков необходимо извлечь из снимка состояния системы с помощью функций Module32First() и Module32Next() значения соответствующих полей.

Обращение к функциям имеет вид:

Module32First (hSnapshot, LPMODULEENTRY32);

Module32Next (hSnapshot, LPMODULEENTRY32).

Первый аргумент – хэндл созданного снимка (возвращает функция CreateToolHelp32Snapshot).

Второй аргумент – структура, содержащая 10 полей:

  1. Первое поле – dwSize – размер структуры в байтах. Это единственное поле, которое должно быть заполнено до вызова функции Module 32First. Заполнить его можно, используя выражение sizeof(ModuleEntry32);

  2. th32ModuleID: DWORD – размер модуля;

  3. th32ProcessID: DWORD – идентификатор процесса, владеющего модулем;

  4. GlblcntUsage: DWORD – счетчик глобальных пользователей модуля;

  5. ProccntUsage: DWORD – счетчик процессов - пользователей;

  6. modBaseAddr: BYTE – базовый адрес модуля;

  7. modBaseSize: DWORD – базовый размер модуля;

  8. hModule: HMODULE – хэндл модуля;

  9. szModule: array [1.. MAX_MODULE_NAME32 + 1] of char – имя модуля;

  10. szExePath: array [1.. MAX_PATH] of char – путь размещения модуля.