代码之家  ›  专栏  ›  技术社区  ›  Canopus

检查Win32线程是否正在运行或处于挂起状态

  •  16
  • Canopus  · 技术社区  · 15 年前

    如何检查Win32线程是否正在运行或处于挂起状态?

    我找不到任何提供线程状态的win32 api。那么如何获取线程状态呢?

    8 回复  |  直到 10 年前
        1
  •  15
  •   Chris Becke    15 年前

    我认为-最初-没有提供此信息,因为提供此信息的任何API都会误导和无用。

    考虑两种可能的情况-当前线程已挂起感兴趣的线程。当前线程中的代码 知道 关于挂起状态,应该能够共享它,这样内核团队就不需要添加API。

    第二种情况,系统中的其他/a第三个线程已挂起感兴趣的线程(并且无法跟踪是哪个线程)。现在您有了一个争用条件-其他线程可以随时取消挂起感兴趣的线程,而从API收集的信息是无用的-您有一个值,指示线程实际上是挂起的,而不是挂起的。

    故事的寓意——如果你想知道一个线程被挂起——挂起它:挂起线程的返回值是该线程的前一个挂起计数。现在你知道了一些有用的东西——线程曾经还是挂起的——这很有用。或者它没有(但现在)被暂停。不管怎样,线程的状态现在是确定的,所以理论上你可以基于它做出一些明智的选择——是恢复方法,还是让它保持挂起状态。

        2
  •  3
  •   Stephen Kellett    14 年前

    您可以通过使用SystemProcessesAndThreadsInformation(整数值5)的值调用ntQuerySystemInformation()来获取此信息。

    如果你想要一个你能用这些信息做什么的例子,看看 Thread Status Monitor .

        3
  •  2
  •   Richard    15 年前

    WMI的 Win32_Thread 类有 ThreadState 属性,其中5:“Suspended Blocked”和6:Suspended Ready。

    您将需要线程的ID来直接获取正确的实例(wmi对象的handle属性是线程ID)。

    编辑:给定此PowerShell查询:

    gwmi win32_thread | group ThreadState
    

    给予

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

    WMI对win32有不同的“挂起”定义。

        4
  •  2
  •   Jeremy    13 年前

    虽然它没有文档记录-虽然它应该是imho,但是如果调用waitForSingleObject,那么如果线程被挂起,它将返回wait-awarded。此外,如果线程已终止,则其句柄将处于信号状态。

    最让我恼火的是当有人回答你的问题,告诉你为什么你不应该回答你的问题…或者开始提问 为什么? 你想这么做。当有人在谷歌上发现这个问题时,原因是 为什么? 不一样,因此答案会使自己对其他人毫无用处。

        5
  •  1
  •   Brian R. Bondy    15 年前

    在Windows 7中,您可以使用 QueryUmsThreadInformation . (ums代表用户模式调度)。

    here 对于 UmsThreadIsSuspended .

        6
  •  1
  •   Andrey    15 年前

    您可以使用如下代码获取线程挂起计数:

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

    但是,正如前面所说,这是不准确的。 此外,挂线也是邪恶的。

        7
  •  0
  •   anand    15 年前

    我认为这里的州被称为

    • 如果线程在线程进程中,则执行一些处理或
    • 正在等待事件

    这可以通过使用变量来处理,该变量可以告诉线程是否正在实际运行或等待事件发生。

    当考虑线程池时,如果有N个线程,并且根据每个线程的运行状态,可以将任务分配给空闲线程。

        8
  •  0
  •   Community chadoh    7 年前

    是:可以获取线程状态并确定它是否被挂起。

    不,你不需要Windows7。

    我在StackOverflow上发布了我的工人阶级: How to get thread state (e.g. suspended), memory + CPU usage, start time, priority, etc

    此类需要Windows 2000或更高版本。