2012-06-04 8 views
7

सी ++ 11 की मानक पुस्तकालय में <thread> है जो धागे को बनाने की अनुमति देता है। हालांकि, विंडोज एपीआई को कुछ कार्यों के लिए एक आईडी की आवश्यकता है (PostThreadMessage, अर्थात्)। मैं इसे कैसे प्राप्त कर सकता हूँ?मानक लाइब्रेरी का उपयोग करके बनाए गए थ्रेड की winapi आईडी कैसे प्राप्त करें?

टिप्पणी: std::thread::get_id() काम करने के लिए प्रतीत नहीं होता:

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

क्या 'GetCurrentThreadId' काम करता है? एक अलग थ्रेड से भी, आप इसे थ्रेड के भीतर से सवाल में इस्तेमाल कर सकते हैं और स्टोर कर सकते हैं, अगर यह पहले स्थान पर काम करता है। – chris

उत्तर

11

सदस्य फ़ंक्शन native_handle() का उपयोग करें। यह मूल धागा हैंडल प्रदान करता है। फिर आप GetThreadId() पर कॉल कर सकते हैं।

+4

ध्यान दें कि 'native_handle()' थ्रेड के लिए 'हैंडल' ('शून्य *') देता है; 'PostThreadMessage()' को कॉल करने के लिए आपको हैंडल से पहचानकर्ता प्राप्त करने के लिए 'GetThreadId() 'की भी आवश्यकता होगी। –

+0

@ जेम्स जोड़ा गया, धन्यवाद। –

0

thread::id वर्ग केवल id और एक आउटपुट के बीच तुलना की अनुमति देता है। यह वास्तविक अंतर्निहित id तक पहुंचने का साधन प्रदान नहीं करता है। आप इसे stringstream पर आउटपुट करने का प्रयास कर सकते हैं और फिर इसे वापस पार्स कर सकते हैं, मुझे लगता है।

+0

मुझे समझ में नहीं आता कि स्ट्रिंगस्ट्रीम कैसे मदद करेगा? – qdii

+0

@Qdii, आईडी जानता है कि स्ट्रीम को खुद को कैसे प्रिंट करें (डीबगिंग के लिए)। कार्यान्वयन केवल अपने सांख्यिक मूल्य मुद्रित होता है। एक बार जब आपके पास स्ट्रिंगस्ट्रीम में संख्यात्मक मान हो, तो आप इसे वापस एक संख्यात्मक प्रकार में पढ़ सकते हैं। –

+0

@ रोबकेनेडी: क्या मैं निश्चित हो सकता हूं कि 'थ्रेड :: आईडी' विंडोज एपीआई वैल्यू के समान मूल्य है? (मैंने सोचा कि यह एक मध्यस्थ पुस्तकालय का मूल्य हो सकता है, जैसे, pthread)। – qdii

संबंधित मुद्दे