17 Stimmen

Prüfen, ob ein Win32-Thread läuft oder sich im Ruhezustand befindet

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?

14voto

Chris Becke Punkte 32199

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.

6voto

Stephen Kellett Punkte 2893

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 .

2voto

Richard Punkte 103159

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.

1voto

Brian R. Bondy Punkte 325712

In Windows 7 können Sie Folgendes verwenden Abfrage von UmsThread-Informationen . (UMS steht für User mode scheduling).

Siehe aquí para UmsThreadIsSuspended .

1voto

Andrey Punkte 4051

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.com

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.

Powered by:

X