¿Cómo puedo establecer un nombre para un hilo de Win32. No encontré ninguna API de Win32 para lograr lo mismo. Básicamente, quiero agregar el nombre del hilo en el archivo de registro. ¿Es TLS (Thread Local Storage) la única forma de hacerlo?¿Cómo establecer el nombre de un hilo de Win32?
Respuesta
Siempre puede almacenar esta información en una estructura de datos adecuada. Use un hash o un mapa para asignar GetThreadId() a este nombre. Como GetThreadId() siempre es un identificador único, funciona bien.
¡Salud!
Por supuesto, si está creando muchos hilos, que HashMap llenará lentamente y utilizar más y más memoria, por lo algún procedimiento de limpieza es probablemente una buena cosa también.
Tienes toda la razón. Cuando un hilo muere, su entrada correspondiente en el mapa debe eliminarse naturalmente.
Por supuesto, si está creando muchos subprocesos, ese hashmap se llenará lentamente y usará más y más memoria, por lo que algunos procedimientos de limpieza también son algo bueno. –
downvoting porque también necesito una respuesta a esta pregunta, pero en realidad necesito establecer un nombre para el hilo por razones de perfil. Su respuesta no responde la pregunta: P –
¿Le sirve de ayuda? How to: Set a Thread Name in Native Code
En el código administrado, es tan fácil como establecer la propiedad Nombre del objeto Thread correspondiente.
Supongo que es solo para que el depurador de Visual Studio muestre el nombre del subproceso. – Canopus
Otros depuradores han seguido y responden a la misma señal –
Como http://thetweaker.wordpress.com/2009/04/10/naming-threads/ notes, todos lo hacen almacenando el nombre del subproceso en una estructura de datos del depurador . Ergo, sin un depurador, el nombre no se almacenaría y no estaría disponible para fines de registro. Error desagradable, también: cuando intenta depurarlo, de repente funciona de nuevo. – MSalters
Si desea ver el nombre de su hilo en el depurador (windbg o Visual Studio): http://blogs.msdn.com/stevejs/archive/2005/12/19/505815.aspx
realidad no estoy seguro si hay un método inverso para obtener el nombre del hilo. Pero TLS parece ser el camino a seguir.
Tiene una impresión equivocada. El nombre del hilo ** no ** está almacenado con el hilo. Se almacena únicamente en el depurador y, en consecuencia, solo existe cuando se conecta un depurador. Sin un depurador, la excepción simplemente se ejecuta en el siguiente filtro de excepción, que continúa como si nunca hubiera pasado nada. El nombre del subproceso se pierde cuando la aplicación no se ejecuta bajo un depurador. – IInspectable
http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.90).aspx
//
// Usage: SetThreadName (-1, "MainThread");
//
#include <windows.h>
const DWORD MS_VC_EXCEPTION=0x406D1388;
#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // Must be 0x1000.
LPCSTR szName; // Pointer to name (in user addr space).
DWORD dwThreadID; // Thread ID (-1=caller thread).
DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)
void SetThreadName(DWORD dwThreadID, char* threadName)
{
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
__try
{
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}
Esto no funcionará, a menos que ejecute el código en un depurador. Ciertamente no se puede usar para registrar el nombre de un hilo en un sistema en vivo. – IInspectable
hilos Win32 no tienen nombres. Existe una convención de Microsoft según la cual las aplicaciones presentan excepciones especiales de SEH que contienen un nombre de subproceso. Estas excepciones pueden ser interceptadas por los depuradores y utilizadas para indicar el nombre de la secuencia. Un par de respuestas cubre eso.
Sin embargo, eso es manejado por el depurador. Los hilos en sí mismos son objetos sin nombre. Entonces, si quiere asociar nombres con sus hilos, tendrá que desarrollar su propio mecanismo. Aunque podría usar el almacenamiento local de subprocesos que solo le permitirá obtener el nombre del código que se ejecuta en ese subproceso. Por lo tanto, un mapa global entre la ID del hilo y el nombre parecería el enfoque más natural y útil.
Otra forma de hacerlo es almacenar un puntero al nombre en el campo ArbitraryUserPointer del TEB del subproceso. Esto se puede escribir y leer en tiempo de ejecución.
Hay un artículo de CodeProject titulado "Debugging With The Thread Information Block" que le muestra cómo hacerlo.
Puede usar un objeto de almacenamiento local de subprocesos para almacenar el nombre. Por ejemplo,
__declspec(thread) char threadName[32];
entonces usted puede escribir y leer esto de un hilo. Esto podría ser útil en una aplicación de registro, donde desea imprimir el nombre del hilo para cada mensaje. Probablemente desee escribir esta variable tan pronto como se inicie el hilo, y también lanzar la excepción de Microsoft (https://stackoverflow.com/a/10364541/364818) para que el depurador también conozca el nombre de la secuencia.
De acuerdo con la discusión con los cables del equipo de depuración de Microsoft (consulte el enlace a continuación para obtener más detalles) la API SetThreadDescription es la API que utilizará Microsoft en adelante para admitir el nombre de subproceso oficialmente en código nativo. Por "oficialmente" me refiero a una API soportada por MS para nombrar subprocesos, a diferencia del truco de lanzamiento de excepción actual que actualmente solo funciona mientras se está ejecutando un proceso en Visual Studio.
Esta API se hizo disponible a partir de Windows 10, versión 1607.
Actualmente, sin embargo, hay muy poco apoyo de herramientas, por lo que los nombres que ha establecido no serán visibles en el depuradores WINDBG Visual Studio o. A partir de abril de 2017, sin embargo, las herramientas Microsoft xperf/WPA sí lo admiten (los hilos nombrados a través de esta API tendrán sus nombres aparecerán correctamente en esas herramientas).
Si desea ver esta ganancia mejor soporte, como por ejemplo en WinDbg, Visual Studio y archivos de volcado de sucesos, puedes votar por ella usando este enlace:
Actualización: Windows Performance Analyzer y una nueva versión de WinDbg ahora admiten mostrar los nombres de subprocesos establecidos a través de SetThreadDescriptionAPI. https://blogs.msdn.microsoft.com/windbg/2017/06/29/debugger-updates-in-the-16225-sdk-preview/ –
- 1. ¿Cómo obtener el nombre de un hilo Win32?
- 2. ¿Cómo establecer el nombre del hilo?
- 3. ¿Cómo puedo determinar si un hilo de Win32 ha finalizado?
- 4. ¿Cómo establecer el nombre de proceso ejecutable de un proyecto?
- 5. cómo establecer un nombre de subproceso en MacOSX
- 6. ¿Cómo dar nombre a un hilo invocable?
- 7. Cambio de nombre de hilo
- 8. Nombre del hilo de un AsyncTask
- 9. ¿Cómo matar procesos por nombre? (Win32 API)
- 10. especificar el nombre de un hilo cuando se utiliza Task.StartNew
- 11. Establecer el hilo como fondo o no
- 12. Win32: ¿Cómo obtener el proceso/thread que posee un mutex?
- 13. Darle un nombre a un hilo de impulso?
- 14. obtener el nombre del proceso desde el proceso id (win32)
- 15. Cómo obtener el uso de CPU por hilo en Windows (win32)
- 16. Cómo establecer ActiveX Control Nombre
- 17. Nombre del hilo en el ThreadPool - C#
- 18. ¿Cómo obtener el estado de un hilo?
- 19. ¿Cómo establecer un nombre de rol PrincipalPermission en varios idiomas?
- 20. ¿Cómo puedo establecer un nombre de modelo dinámico en AngularJS?
- 21. Cómo establecer el nombre de net.sf.ehcache.CacheManager para la supervisión JMX?
- 22. gdb cómo obtener el nombre del hilo mostrado
- 23. ¿Cómo pasar un puntero de interfaz a un hilo?
- 24. nombre del hilo de impresión usando java.util.logging
- 25. Cómo establecer el tamaño del área No cliente de una ventana Win32 (nativa)
- 26. ¿Cómo establecer el nombre del atributo de un bean con ámbito de la sesión de primavera?
- 27. cómo matar el hilo php de fondo?
- 28. Win32 Programación de subprocesos
- 29. Temporizador en un servicio win32
- 30. ¿Cómo cambiar el nombre de un recurso en Visual Studio?
El SetThreadDescription() de la API es , en adelante, la API por la cual Microsoft apoyará esto. Para obtener más detalles, consulte esta respuesta: http://stackoverflow.com/a/43787005/434413 –