Проверьте, работает ли поток 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 или выше.