Wie überprüfe ich, ob ein Win32-Thread läuft oder sich in einem angehaltenen Zustand befindet?
Ich kann keine Win32-API finden, die den Status eines Threads angibt. Wie bekomme ich also den Thread-Status?
Wie überprüfe ich, ob ein Win32-Thread läuft oder sich in einem angehaltenen Zustand befindet?
Ich kann keine Win32-API finden, die den Status eines Threads angibt. Wie bekomme ich also den Thread-Status?
Ich denke, dass diese Informationen ursprünglich nicht bereitgestellt wurden, weil jede API, die diese Informationen liefern würde, irreführend und nutzlos wäre.
Betrachten Sie zwei mögliche Fälle: Der aktuelle Thread hat den Thread von Interesse ausgesetzt. Code im aktuellen Thread kennt über den Suspendierungszustand und sollten in der Lage sein, diesen zu teilen, so dass das Kernel-Team keine API hinzufügen muss.
Im 2. Fall hat ein anderer / ein dritter Thread im System den interessierenden Thread angehalten (und es gibt keine Möglichkeit zu verfolgen, welcher Thread das war). Jetzt haben Sie eine Wettlaufbedingung - dieser andere Thread könnte den Thread von Interesse jederzeit wieder suspendieren und die von der API gewonnenen Informationen sind nutzlos - Sie haben einen Wert, der anzeigt, dass der Thread suspendiert ist, obwohl er es in Wirklichkeit nicht ist.
Die Moral von der Geschichte: Wenn Sie wissen wollen, dass ein Thema ausgesetzt ist, dann setzen Sie es aus: Der Rückgabewert von SuspendThread ist die Anzahl der vorherigen Suspendierungen des Threads. Und jetzt wissen Sie etwas Nützliches: Der Thread war und ist immer noch suspendiert - was nützlich ist. Oder dass er nicht suspendiert war (aber jetzt ist). So oder so ist der Zustand des Threads nun deterministisch bekannt, so dass Sie theoretisch einige intelligente Entscheidungen auf dieser Grundlage treffen können - ob Sie den Thread wieder aufnehmen oder ihn in der Schwebe halten.
Sie erhalten diese Informationen durch den Aufruf von NtQuerySystemInformation() mit dem Wert für SystemProcessesAndThreadsInformation (Ganzzahlwert 5).
Wenn Sie ein Beispiel dafür suchen, was Sie mit diesen Informationen tun können, sehen Sie sich Folgendes an Thread Status Monitor .
WMI's Win32_Thread Klasse hat eine ThreadState
wobei 5: "Suspended Blocked" und 6:Suspended Ready.
Sie benötigen die Id des Threads, um direkt die richtige Instanz zu erhalten (die Handle-Eigenschaft des WMI-Objekts ist die Thread-Id).
EDIT: Angesichts dieser PowerShell-Abfrage:
gwmi win32_thread | group ThreadState
gibt
Count Name Group
----- ---- -----
6 2 {, , , ...}
966 5 {, , , ...}
WMI hat eine andere Definition von "Suspended" als Win32.
In Windows 7 können Sie Folgendes verwenden Abfrage von UmsThread-Informationen . (UMS steht für User mode scheduling).
Siehe aquí para UmsThreadIsSuspended
.
Sie können die Anzahl der ausgesetzten Threads mit folgendem Code ermitteln:
DWORD GetThreadSuspendCount(HANDLE hThread) {
DWORD dwSuspendCount = SuspendThread(hThread);
ResumeThread(hThread);
return dwSuspendCount;
}
aber, wie bereits gesagt, es ist nicht genau. Außerdem ist das Aussetzen eines Threads ein Übel.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.