Я решил использовать модуль Джексона для Scala .
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val obj = mapper.readValue[Map[String, Object]](jsonString)
Я думаю - изначально - эта информация не была предоставлена, потому что любой API, предоставляющий эту информацию, будет вводить в заблуждение и бесполезен.
Рассмотрим два возможных случая - текущий поток приостановил выполнение потока -интерес. Код в текущем потоке знает о приостановленном состоянии и должен иметь возможность поделиться им, поэтому команде ядра нет необходимости добавлять API.
Второй случай, какой-то другой / третий поток в система приостановила интересующий поток (и нет возможности отследить, какой поток это был). Теперь у вас есть состояние гонки - этот другой поток может в любой момент - отменить приостановку интересующего потока, а информация, полученная из API, бесполезна - у вас есть значение, указывающее, что поток приостановлен, хотя на самом деле это не так.
Мораль истории - если вы хотите знать, что поток приостановлен - приостановите его: возвращаемое значение SuspendThread - это предыдущий счетчик приостановки потока. И теперь вы ДЕЙСТВИТЕЛЬНО знаете кое-что полезное - ветка БЫЛА И ЕЩЕ ПРИОСТАНОВЛЕНА - что полезно. Или что это НЕ БЫЛО (но сейчас) приостановлено. В любом случае, состояние потока теперь детерминированно известно, поэтому теоретически вы можете сделать на его основе разумный выбор - использовать ResumeThread или оставить его приостановленным.
Класс Win32_Thread WMI имеет свойство ThreadState
, где 5: «Приостановлено, заблокировано» и 6: Приостановлено, готово.
Вам понадобится идентификатор потока, чтобы получить нужный экземпляр напрямую (свойство Handle объекта WMI является идентификатором потока).
РЕДАКТИРОВАТЬ: Учитывая этот запрос PowerShell:
gwmi win32_thread | group ThreadState
дает
Count Name Group ----- ---- ----- 6 2 {, , , ...} 966 5 {, , , ...}
WMI имеет другое определение «приостановлено», чем Win32.
In Windows 7, you can use QueryUmsThreadInformation. (UMS stands for User mode scheduling).
See here for UmsThreadIsSuspended
.
вы можете получить счетчик приостановленных потоков с помощью такого кода:
DWORD GetThreadSuspendCount(HANDLE hThread) {
DWORD dwSuspendCount = SuspendThread(hThread);
ResumeThread(hThread);
return dwSuspendCount;
}
, но, как уже было сказано, это неточно. Более того, приостановить цепочку - зло.
Я думаю, что состояние здесь упоминается как
Об этом можно позаботиться, используя переменная, которая может сказать, что если поток действительно запущен или ожидает события.
Эти сценарии появляются при рассмотрении пулов потоков, имеющих несколько n потоков, и в зависимости от состояния работы каждого потока задачи могут быть назначены незанятым потокам.
Вы можете получить эту информацию, вызвав NtQuerySystemInformation () со значением для SystemProcessesAndThreadsInformation (целочисленное значение 5).
Если вам нужен пример того, что можно сделать с этой информацией, посмотрите Монитор состояния потока .