Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Определение количества приостановок (suspend) потока

Delphi , Компоненты и Классы , Потоки

Определение количества приостановок (suspend) потока

Автор: Эдгар
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Определение количества приостановок (suspend) потока

Зависимости: НЕТУ
Автор:       Эдгар, Songoku@tut.by, Berlin
Copyright:   Copyright DPRSystem 1999-2004 by x-ssg
Дата:        29 февраля 2004 г.
***************************************************** }

function NtSuspendThread(ThreadHandle, PreviousSuspendCount: DWORD): DWORD;
  stdcall external 'NTDLL.DLL';

function NtResumeThread(ThreadHandle, SuspendCount: DWORD): DWORD; stdcall
  external 'NTDLL.DLL';

.....

function GetSuspendCount(Thread: DWORD): DWORD;
var
  tmp: ^DWORD;
begin
  Result := 0;
  if GetCurrentThread <> Thread then
  begin // Если в параметре наш поток то тогда возвращает 0, то есть поток работает
    if NtSuspendThread(Thread, dword(@tmp)) <> 0 then
      Result := Dword(-1)
    else // Останавливаем поток. И сохраняем значение PreviousSuspendCount в Result
      Result := dword(tmp);
    NtResumeThread(Thread, dword(@tmp)); // Возобновляем работу потока
  end;
end;

// В результате находится количество "остановок" потока.
// Если результат 0 - то значит поток работает!

Программа на Delphi!

Код определяет функцию GetSuspendCount, которая получает количество раз, когда поток был приостановлен (т.е., помечен для сна) с помощью функций Windows API NtSuspendThread и NtResumeThread.

Вот подробное описание кода:

  1. Первые две строки импортируют два функциона Windows API:
    • NtSuspendThread: приостанавливает поток, возвращая предыдущий счетчик приостановки.
    • NtResumeThread: возобновляет приостановленный поток, передавая счетчик приостановки в качестве аргумента.
  2. Функция GetSuspendCount принимает handle потока (DWORD-значение) в качестве входного параметра и возвращает количество раз, когда поток был приостановлен.
  3. Если текущий поток не является тем, который запрашивается (GetCurrentThread <> Thread), функция продолжает проверять, находится ли поток в состоянии приостановки:
    • Если он приостановлен, вызывает NtSuspendThread с handle потока и указателем на переменную tmp (^DWORD). Функция возвращает предыдущий счетчик приостановки в tmp.
    • Сохраняет значение tmp в переменной Result.
    • Вызывает NtResumeThread, чтобы возобновить поток, передавая тот же handle потока и tmp-значение.
  4. Если поток не приостановлен, устанавливает Result в 0, указывая, что потокcurrently запущен.

Функция возвращает DWORD-значение, представляющее количество раз, когда поток был приостановлен. Возвращаемое значение 0 означает, что потокcurrently запущен.

Замечание: код использует функции Windows API и требует наличия библиотеки NTDLL.DLL на системе.

Функция GetSuspendCount позволяет определить количество приостановок (suspend) потока, проверив его статус на работу или остановку.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:25:22/0.005281925201416/1