Проверьте, работает ли поток Win32 или находится в приостановленном состоянии - PullRequest
16 голосов
/ 17 июня 2009

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

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

Ответы [ 7 ]

15 голосов
/ 17 июня 2009

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

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

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

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

3 голосов
/ 21 мая 2010

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

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

2 голосов
/ 17 июня 2009

WMI's Win32_Thread имеет свойство ThreadState, где 5: «Suspended Blocked» и 6: Suspended Ready.

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

РЕДАКТИРОВАТЬ: Учитывая этот запрос PowerShell:

gwmi win32_thread | group ThreadState

дает

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

WMI имеет другое определение «Приостановлено» для Win32.

1 голос
/ 18 июня 2009

вы можете получить счетчик приостановки потока с кодом, подобным этому:

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

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

1 голос
/ 17 июня 2009

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

См. здесь для UmsThreadIsSuspended.

0 голосов
/ 09 апреля 2014

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

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

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

Этот класс требует Windows 2000 или выше.

0 голосов
/ 18 июня 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...