2012-06-04 3 views
7

Die Standardbibliothek von C++ 11 enthält <thread>, die das Erstellen von Threads ermöglicht. Für einige Funktionen benötigt die Windows API jedoch eine ID (PostThreadMessage, nämlich). Wie kann ich es bekommen?Wie bekomme ich die Winapi-ID eines Threads, der mit der Standardbibliothek erstellt wurde?

Bemerkung: std::thread::get_id() scheint nicht zu funktionieren:

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

Funktioniert 'GetCurrentThreadId'? Auch aus einem anderen Thread könnten Sie das innerhalb des betreffenden Threads verwenden und speichern, wenn es überhaupt funktioniert. – chris

Antwort

11

Verwenden Sie die Elementfunktion native_handle(). Es bietet das native Thread-Handle. Dann kannst du GetThreadId() darauf anrufen.

+4

Beachten Sie, dass 'native_handle()' ein 'HANDLE' (' void * ') für den Thread zurückgibt; Sie benötigen auch 'GetThreadId()', um die Kennung vom Handle zum Aufrufen von 'PostThreadMessage()' zu erhalten. –

+0

@James Hinzugefügt, danke. –

0

Die thread::id Klasse erlaubt nur Vergleich zwischen id s und einem Ausgang. Es bietet keine Möglichkeit, auf das eigentliche zugrunde liegende id zuzugreifen. Sie könnten versuchen, es an einen stringstream auszugeben und es dann wieder zu analysieren, denke ich.

+0

Ich verstehe nicht, wie ein Stringstream helfen würde? – qdii

+0

@Qdii, die ID weiß, wie sie sich selbst in einen Stream schreibt (zum Debuggen). Die Implementierung druckt einfach ihren numerischen Wert. Sobald Sie den numerischen Wert in einem Stringstream haben, können Sie ihn in einen numerischen Typ zurücklesen. –

+0

@RobKennedy: kann ich sicher sein, dass die 'thread :: id 'der gleiche Wert wie der Windows API-Wert ist? (Ich dachte, es könnte der Wert einer Zwischenbibliothek sein, wie Pthread). – qdii

Verwandte Themen