如何检查Win32线程是否正在运行或处于挂起状态?
我找不到任何给出线程状态的Win32 API。那么如何获得线程状态呢?
答案 0 :(得分:15)
我认为 - 最初 - 未提供此信息,因为提供此信息的任何API都会产生误导和无效。
考虑两种可能的情况 - 当前线程已暂停感兴趣的线程。当前线程中的代码知道有关挂起的状态,并且应该能够共享它,因此内核团队无需添加API。
第二种情况,系统中的其他一些/第三个线程已经暂停了感兴趣的线程(并且无法跟踪哪个线程)。现在你有一个竞争条件 - 其他线程可以在任何时候 - 取消挂起感兴趣的线程,并且从API中收集的信息是无用的 - 你有一个值,表明线程在实际上是暂停的,不是。
故事的道德 - 如果你想知道线程被挂起 - 暂停它:SuspendThread的返回值是线程的先前挂起计数。而现在你知道一些有用的东西 - 线程仍然悬而未决 - 这很有用。或者它没有(但现在是)被暂停。无论哪种方式,线程的状态现在都是确定性的,因此理论上您可以根据它做出一些明智的选择 - 无论是ResumeThread,还是保持暂停状态。
答案 1 :(得分:3)
您可以通过使用SystemProcessesAndThreadsInformation(整数值5)的值调用NtQuerySystemInformation()来获取此信息。
如果您想了解如何处理此信息,请查看Thread Status Monitor。
答案 2 :(得分:2)
WMI的Win32_Thread类有ThreadState
属性,其中5:“暂停被阻止”,6:暂停就绪。
您需要Thread的ID才能直接获取正确的实例(WMI对象的Handle属性是线程ID)。
编辑:鉴于此PowerShell查询:
gwmi win32_thread | group ThreadState
给出
Count Name Group ----- ---- ----- 6 2 {, , , ...} 966 5 {, , , ...}
WMI对Win32的“暂停”定义不同。
答案 3 :(得分:1)
在Windows 7中,您可以使用QueryUmsThreadInformation。 (UMS代表用户模式调度)。
UmsThreadIsSuspended
查看{{1}}。
答案 4 :(得分:1)
您可以使用以下代码获取线程挂起计数:
DWORD GetThreadSuspendCount(HANDLE hThread) {
DWORD dwSuspendCount = SuspendThread(hThread);
ResumeThread(hThread);
return dwSuspendCount;
}
但是,正如已经说过的那样 - 这是不准确的。 而且,暂停一个线程是邪恶的。
答案 5 :(得分:0)
我认为这里的州被称为
这可以通过使用变量来处理,该变量可以告诉线程是否实际正在运行或等待事件发生。
这些场景在考虑线程池时出现,有一些n个线程并且基于每个线程运行状态,可以将任务分配给空闲线程。
答案 6 :(得分:0)
是:可以获取线程状态并确定它是否被暂停。
并且否:您不需要Windows 7来执行此操作。
我在Stackoverflow上发布了我的工作班:How to get thread state (e.g. suspended), memory + CPU usage, start time, priority, etc
此类需要Windows 2000或更高版本。