Проверьте, работает ли поток Win32 или приостановлено

Как проверить, работает ли поток Win32 или приостановлено?

Я не могу найти Win32 API, который дает состояние потока. Итак, как мне получить состояние потока?

Ответы

Ответ 1

Я думаю - изначально - эта информация не была предоставлена, потому что любой API, который предоставил эту информацию, был бы вводящим в заблуждение и бесполезным.

Рассмотрим два возможных случая: текущий поток приостановил поток, представляющий интерес. Код в текущем потоке знает о приостановленном состоянии и должен иметь возможность делиться им, поэтому нет необходимости, чтобы команда ядра добавляла API.

Второй случай, какой-то другой/третий поток в системе приостановил интересующий поток (и theres никак не отслеживать, какой поток был). Теперь у вас есть условие гонки - этот другой поток может в любой момент отказаться от потока интереса, а информация, полученная из API, бесполезна - у вас есть значение, указывающее, что поток приостановлен, когда он на самом деле, а не.

Мораль истории - если вы хотите знать, что поток приостановлен - приостановите его: возвращаемое значение из SuspendThread - это предыдущее количество приостановленных потоков. И теперь вы знаете что-то полезное - поток WAS AND STILL приостановлен - что полезно. Или, что он не был (но сейчас) приостановлен. В любом случае, состояние потока теперь детерминистически известно, поэтому вы можете теоретически сделать некоторые разумные варианты, основанные на этом - будь то ResumeThread или приостановить его.

Ответ 2

Вы можете получить эту информацию, вызвав NtQuerySystemInformation() со значением для SystemProcessesAndThreadsInformation (целочисленное значение 5).

Если вам нужен пример того, что вы можете сделать с этой информацией, посмотрите Монитор состояния темы.

Ответ 3

Пока он не задокументирован - хотя он должен быть IMHO, если вы вызываете WaitForSingleObject, он вернет WAIT_ABANDONED, если поток приостановлен. Кроме того, если поток завершен, его дескриптор будет находиться в сигнальном состоянии.

Что меня больше всего беспокоит, когда кто-то отвечает на ваши вопросы, рассказывая вам, почему у вас не должно быть ответа на ваш вопрос... Или начинает опрос ПОЧЕМУ вы хотите это сделать. Когда кто-то находит этот вопрос в Google, причины ПОЧЕМУ не совпадают, и поэтому ответ окажет себя бесполезным для кого-либо еще.

Ответ 4

WMI класс Win32_Thread имеет свойство ThreadState, где 5: "приостановлено заблокировано" и 6: приостановлено.

Вам понадобится ИД потока, чтобы получить правильный экземпляр напрямую (свойство дескриптора объекта WMI - это идентификатор потока).

EDIT: данный запрос PowerShell:

gwmi win32_thread | group ThreadState

дает

Count Name  Group
----- ----  -----
    6 2     {, , , ...}
  966 5     {, , , ...}

У WMI есть другое определение "Приостановлено" для Win32.

Ответ 5

В Windows 7 вы можете использовать QueryUmsThreadInformation. (UMS означает планирование режима пользователя).

Смотрите здесь для UmsThreadIsSuspended.

Ответ 6

вы можете получить поток suspend count с таким кодом:

DWORD GetThreadSuspendCount(HANDLE hThread) {
    DWORD dwSuspendCount = SuspendThread(hThread);
    ResumeThread(hThread);
    return dwSuspendCount;
}

но, как уже говорилось, это неточно. Более того, приостановка потока - это зло.

Ответ 7

У вас нет, к сожалению. В зависимости от вашего кода вы можете приблизиться к этому (установив флаг, когда вы ожидаете, например, объект ядра), но имейте в виду, что поток всегда может блокироваться внутри вызова операционной системы или библиотеки, и вы не знаете об этом.

Ответ 8

Я думаю, что состояние здесь называется

  • Если поток в потоке proc, выполните некоторую обработку Or
  • Ожидание события

Об этом можно позаботиться, используя переменную, которая может сказать, что если поток фактически запущен или ожидает события.

Эти сценарии появляются при рассмотрении потоков потоков, имеющих некоторые n потоков и основанных на каждом запущенном потоке, задачи могут быть назначены простаивающим потокам.

Ответ 9

ДА: возможно получить состояние потока и определить, приостановлено ли оно.

И НЕТ: для этого вам не нужна Windows 7.

Я опубликовал свой рабочий класс здесь в Stackoverflow: Как получить состояние потока (например, приостановлено), память + использование ЦП, время начала, приоритет и т.д.

Для этого класса требуется Windows 2000 или выше.