2012-02-20 20 views
13

Conozco el proceso no intuitivo para establecer el nombre de un hilo en Windows (consulte "How to set name to a Win32 Thread?"). ¿Hay alguna forma de obtener el nombre del hilo? No veo ninguna API de Windows que me permita hacer esto (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx).¿Cómo obtener el nombre de un hilo Win32?

+1

Usted puede obtener el nombre de función de inicio del hilo si eso le ayuda de alguna manera. – Nawaz

+0

@Nawaz ¿Cómo harías eso? –

+1

@CS .: Debes utilizar estas API: [SymInitialize] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681351%28v=vs.85%29.aspx) y [SymFromAddr] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681323%28v=vs.85%29.aspx). Los he usado, vea este tema: [Get StartAddress of win32 thread from another process] (http://stackoverflow.com/questions/8679406/get-startaddress-of-win32-thread-from-another-process) – Nawaz

Respuesta

12

No existe tal llamada WinAPI ya que no existen nombres de subprocesos.

Si establece un nombre de subproceso, entonces el depurador de su IDE lo almacenará para usted, lo que hace que sea más fácil de depurar. Sin embargo, el nombre nunca está realmente conectado al hilo por una llamada a la API de Windows.

Si ejecuta la aplicación sin un depurador, la configuración de un nombre de subproceso no tiene ningún efecto, por lo tanto, no puede recuperar el nombre.

Incluso si fuera accesible, no escribiría código que funcione solo con un depurador adjunto. Es mejor que guardes el nombre junto con el mango.

+0

¿Estás diciendo que no hay forma de obtener el nombre del hilo que has establecido en el depurador? Me gustaría poner algo de comprobación de depuración en mi código para asegurarme de que se invocó desde el hilo correcto, usando el nombre del hilo – Arthur

+0

El hilo 0x66c ha salido con el código 0 (0x0) -> Pensé, tal vez el 0x66c es algo así como un nombre ? – Andre

17

Los hilos en realidad no tienen nombres en Win32. El proceso a través del RaiseException es solo un "Apretón de manos secreto" con el depurador VS, que en realidad almacena el mapeo TID => Nombre. Windows mismo no tiene noción de un hilo "Nombre".

7

A partir de Windows 10, versión 1607, ahora puede obtener el nombre de un hilo usando GetThreadDescription(), asumiendo que SetThreadDescription() se utilizó para establecer el nombre del hilo.

He aquí un ejemplo:

HRESULT hr = GetThreadDescription(ThreadHandle, &data); 
if (SUCCEEDED(hr)) 
{ 
    wprintf(“%ls\m”, data); 
    LocalFree(data); 
} 

Aquí está la documentación:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt774972(v=vs.85).aspx

Cuestiones relacionadas