2012-06-04 10 views
7

La biblioteca estándar de C++ 11 contiene <thread> que permite crear subprocesos. Sin embargo, la API de Windows requiere una identificación para algunas funciones (PostThreadMessage, a saber). ¿Cómo puedo obtenerlo?¿Cómo obtener la id de winapi de un hilo creado con la biblioteca estándar?

observación: std::thread::get_id() no parece funcionar:

PostThreadMessage(m_thread->get_id(), WM_QUIT, 0, 0); 

e:\documents\khook\khooker\hook_runner.cpp(129): error C2664: 'PostThreadMessageW' : cannot convert parameter 1 from 'std::thread::id' to 'DWORD' 
+6

¿Funciona el 'GetCurrentThreadId'? Incluso desde un hilo diferente, puede usarlo desde el hilo en cuestión y almacenarlo, si funciona en primer lugar. – chris

Respuesta

11

Utilice la función de miembro native_handle(). Proporciona el identificador de subproceso nativo. Entonces puede llamar al GetThreadId() en él.

+4

Tenga en cuenta que 'native_handle()' devuelve un 'HANDLE' (' void * ') para el hilo; también necesitará 'GetThreadId()' para obtener el identificador del controlador para llamar a 'PostThreadMessage()'. –

+0

@James Agregado, gracias. –

0

La clase thread::id sólo permite la comparación entre id s y una salida. No proporciona un medio para acceder al id subyacente real. Podría intentar enviarlo a stringstream y luego volver a analizarlo, supongo.

+0

No entiendo cómo un stringstream ayudaría? – qdii

+0

@Qdii, el ID sabe cómo imprimirse en una secuencia (para la depuración). La implementación simplemente imprime su valor numérico. Una vez que tenga el valor numérico en un flujo de cadena, puede volver a leerlo en un tipo numérico. –

+0

@RobKennedy: ¿puedo estar seguro de que 'thread :: id' tiene el mismo valor que el valor de la API de Windows? (Pensé que podría ser el valor de una biblioteca intermedia, como, pthread). – qdii

Cuestiones relacionadas