Red de conocimiento informático - Conocimiento informático - Cómo obtener el estado de un hilo

Cómo obtener el estado de un hilo

Si tiene Windows NT, puede utilizar la interfaz pdh. El SDK de la plataforma incluye pdh.h y pdh.lib. Agréguelos al proyecto.

El siguiente código es un fragmento de uno de mis programas:

Por ejemplo, si quieres comprobar el estado del primer hilo de explorer.exe, puedes usarlo como esto (por supuesto, debe realizar algunos cambios usted mismo):

[cpp]Ver texto sin formato

función void()

{

initialize();

LONG rt = GetThreadState(_ T(" explorer/0 "));

Cambiar (derecha)

{

Caso 0://Inicialización, el microkernel reconoce el hilo como un objeto.

Roto;

Caso 1: //Listo, el hilo está listo para ejecutarse en el siguiente procesador inactivo.

Roto;

Caso 2: //Corriendo, el hilo se está ejecutando.

Roto;

Caso 3: //En espera, el hilo está asignado a un procesador y está a punto de ejecutarse. Sólo un hilo puede estar en estado de espera a la vez.

Pausa;

El caso 4:// finaliza y se completa la ejecución del hilo.

Roto;

Caso 5: //Esperando, el hilo no está listo para el procesador. Cuando esté listo, habrá que reprogramarlo.

Roto;

Caso 6: //Transición, el hilo está listo, pero está esperando que otros recursos además del procesador estén disponibles.

Roto;

Caso 7: //desconocido, el estado del hilo es desconocido.

Interrupción;

Valor predeterminado:

Interrupción;

}

}

BOOL CPdhWrapper::Initialize()

{

typedef long(_ _ stdcall * PDHOpenQuery)(LPCSTR, DWORD_PTR, HQUERY);

PDHOpenQuery pfnPdhOpenQuery

m _ hPdhModule = LoadLibrary(_ T(" PDH.DLL "));

if(m_hPdhModule == NULL)

Devuelve FALSO

//La Sra. pdh confundió este lugar. La declaración era PDHOPENQUERYA, pero PdhOpenQueryA se exportó desde pdh.h.

pfnPdhOpenQuery =(PDHOpenQuery)GetProcAddress(m_hPdhModule, "PDHOpenQuery");

if(pfnPdhOpenQuery == NULL)

Devuelve FALSO

return ERROR _ SUCCESS == pfnPdhOpenQuery(NULL, 1; m _ hQuery);

}

LONG CPdhWrapper::query data(LPCTSTR lpCounterName)

{

HCOUNTER hCounter

PDH_FMT_inverse pdhFormattedValue

if(ERROR_SUCCESS!= PdhAddCounter(m_hQuery, lpCounterName, NULL y amphCounter))

return-1;

if(ERROR_SUCCESS!= PdhCollectQueryData(m_hQuery)

||ERROR_SUCCESS!= PdhGetFormattedCounterValue(

hCounter,

PDH_FMT_DRAGON

NULL,

&pdhFormattedValue)

||ERROR_Success! = pdhFormattedValue )

{

pdhformattedvalue. valor largo =-1;

}

PdhRemoveCounter(h contador);

Devuelve pdhFormattedValue.longValue

}

DWORD CPdhWrapper::GetThreadStat(LPCTSTR SZ nombre de hilo)

{

Nombre del contador TCHAR SZ [256];

_stprintf(szCounterName, _T( "//Thread(%s)//Thread State "), nombre del hilo SZ);

Devolver datos de la consulta (nombre del contador SZ);

}