2017-12-28 21 views
0

Ich habe Code, die ich im folgenden Beitrag gefunden:Thema Warte Gründe

How to get thread state (e.g. suspended), memory + CPU usage, start time, priority, etc

Ich untersuche Thread-Zustand, und es gibt die folgende Enumeration, die die Gründe für Thread ‚warten‘ beschreibt Status -

enum KWAIT_REASON 
{ 
    Executive, 
    FreePage, 
    PageIn, 
    PoolAllocation, 
    DelayExecution, 
    Suspended, 
    UserRequest, 
    WrExecutive, 
    WrFreePage, 
    WrPageIn, 
    WrPoolAllocation, 
    WrDelayExecution, 
    WrSuspended, 
    WrUserRequest, 
    WrEventPair, 
    WrQueue, 
    WrLpcReceive, 
    WrLpcReply, 
    WrVirtualMemory, 
    WrPageOut, 
    WrRendezvous, 
    Spare2, 
    Spare3, 
    Spare4, 
    Spare5, 
    Spare6, 
    WrKernel, 
    MaximumWaitReason 
}; 

Kann mir jemand erklären, was WrQueue ist, und vielleicht, was der Unterschied zwischen WrUserRequest und UserRequest ist? Die Informationen werden unter Verwendung von NtQuerySystemInformation() mit SystemProcessInformation erhalten.

+0

'SystemProcessInformation' gibt keine Threadwartegrundinformationen zurück. – IInspectable

+1

@IInspectable Im Code dieses Posts sehe ich, dass es das Array SYSTEM_PROCESS zurückgibt, das das Array SYSTEM_THREAD für jeden der Prozesse enthält. SYSTEM_THREAD enthält den Wartegrund –

+0

@Intspectable - Sie haben einen Fehler gemacht. 'SystemProcessInformation' gibt ein Array von' SYSTEM_PROCESS_INFORMATION' zurück, das ein Array von 'SYSTEM_ [EXTENDED_] THREAD_INFORMATION enthält und hier existiert ein Member' KWAIT_REASON WaitReason; ' – RbMm

Antwort

3

WrQueue Dies ist, wenn Thread warten auf KQUEUE Objekt (siehe Definition in wdm.h) im Kernel. dies kann Anruf ZwRemoveIoCompletion sein oder es Win32 Shell GetQueuedCompletionStatus (IOCP ist genau KQUEUE Objekt). oder Gewinde (von Vista beginnen) nennen ZwWaitForWorkViaWorkerFactory (worker factory intern KQUEUE verwenden auch möglich, dass in Faden kernel Anruf KeRemoveQueue -... Diese in der Regel Arbeitsfäden tun System

WrUserRequest durch win32k.sys Subsystem verwendet wird, in der Regel ist dies bei Gewinden rufen GetMessage so, wenn wir WrUserRequest sehen wir sicher, dass Thread warten auf Fenstermeldungen

UserRequest sein -.. dieser Thread warten auf einen Gegenstand bedeuten [s] über WaitForSingleObject[Ex] oder WaitForMultipleObjects[Ex] oder MsgWaitForMultipleObjects[Ex] (oder Äquivalente)

+0

Genau die Antwort, nach der ich gesucht habe. Vielen Dank! –