WMI技术介绍和应用——查询正在运行的线程信息
? ? ? ? 本文使用了《WMI技術介紹和應用——使用VC編寫一個半同步查詢WMI服務的類》中代碼做為基礎。
? ? ? ? 一般來說,如果試圖枚舉系統中的線程。需要先枚舉系統中的進程,然后再枚舉每個進程中的線程。而WMI給我們提供了一種比較簡便的枚舉線程信息的方法。(轉載請指明出于breaksoftware的csdn博客)
? ? ? ? 如何使用WMI枚舉所有線程的所有信息?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT * FROM Win32_Thread" );
recvnotify.ExcuteFun();
? ? ? ? 以下我粗略介紹下各個屬性的應用。
? ? ? ? 如何使用WMI枚舉正在運行的線程的占用時間?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT ElapsedTime FROM Win32_Thread" );
recvnotify.ExcuteFun();
? ? ? ? 該時間是以毫秒(Milliseconds)為單位。
? ? ? ? 如何使用WMI枚舉正在運行的線程的句柄
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT Handle FROM Win32_Thread" );recvnotify.ExcuteFun();
? ? ? ? MSDN中說明,該句柄具有所有訪問權限。
? ? ? ? 如何使用WMI枚舉正在運行的線程的內核時間?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT KernelModeTime FROM Win32_Thread" );recvnotify.ExcuteFun();
? ? ? ? 該時間以100納秒為單位。
? ? ? ??如何使用WMI枚舉枚舉正在運行的線程基礎等級?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT PriorityBase FROM Win32_Thread" );recvnotify.ExcuteFun();
? ? ? ? 該值是線程基數等級,可以選0~31之間的值。值越高,代表該線程等級越高。
? ? ? ??如何使用WMI枚舉枚舉正在運行的線程動態等級?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT Priority FROM Win32_Thread" );
recvnotify.ExcuteFun();
? ? ? ??該等級是個動態調整的等級。系統通過該等級決定哪個線程享有CPU資源。除了動態等級,還有個基礎等級概念。線程在初始化階段會將動態等級設置成基礎等級值。然后根據需要提升或者降低動態等級。只有基礎等級在0~15的線程的動態等級才會被調整。而系統并不會提升基礎等級在16~31的線程的動態等級。
? ? ? ? 如何使用WMI枚舉所有正在等待非CPU資源的線程的等待原因?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT ThreadWaitReason FROM Win32_Thread Where ThreadState = 6" );recvnotify.ExcuteFun();
? ? ? ? 此處要說明兩個字段的含義。TreadWaitReason字段代表線程等待的原因,而該字段只有在ThreadState為6時有效。ThreadState為6時代表該線程在等待非CPU資源。我們看下ThreadState的值說明
| Value | Meaning |
| 0 | Initialized — It is recognized by the microkernel. |
| 1 | Ready — 該線程已經做好準備運行,等待下一個CPU資源。 |
| 2 | Running — 該線程正在運行。 |
| 3 | Standby — 該線程正準備運行。在一個時刻只有一個線程可以處于這種狀態。 |
| 4 | Terminated — 該線程已經完成執行 |
| 5 | Waiting — 該線程還沒做好運行的準備。當它處于Ready狀態時,它將會被調度。 |
| 6 | Transition — 該線程在等待非CPU資源。 |
| 7 | Unknown — 該線程狀態未知。 |
? ? ? ? 我們再看下TreadWaitReason字段的說明
| Value | Meaning |
|---|---|
| 0 | Executive |
| 1 | FreePage |
| 2 | PageIn |
| 3 | PoolAllocation |
| 4 | ExecutionDelay |
| 5 | FreePage |
| 6 | PageIn |
| 7 | Executive |
| 8 | FreePage |
| 9 | PageIn |
| 10 | PoolAllocation |
| 11 | ExecutionDelay |
| 12 | FreePage |
| 13 | PageIn |
| 14 | EventPairHigh |
| 15 | EventPairLow |
| 16 | LPCReceive |
| 17 | LPCReply |
| 18 | VirtualMemory |
| 19 | PageOut |
| 20 | Unknown |
? ? ? ? 如何使用WMI枚舉線程狀態(ThreadState)不是5(Waiting)的線程所在的進程ID?
CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT ProcessHandle FROM Win32_Thread Where ThreadState <> 5" );recvnotify.ExcuteFun();
? ? ? ? 更多關于線程的信息可以參略Win32_Thread。
總結
以上是生活随笔為你收集整理的WMI技术介绍和应用——查询正在运行的线程信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WMI技术介绍和应用——查询正在运行的进
- 下一篇: WMI技术介绍和应用——查询桌面信息