2012-02-20 19 views
13

मुझे विंडोज के तहत थ्रेड का नाम सेट करने के लिए गैर-सहज प्रक्रिया के बारे में पता है (देखें "How to set name to a Win32 Thread?")। धागे का नाम पाने का कोई तरीका है? मुझे कोई भी विंडोज एपीआई नहीं दिख रहा है जो मुझे ऐसा करने देता है (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)।Win32 थ्रेड का नाम कैसे प्राप्त करें?

+1

आप थ्रेड प्रारंभ समारोह नाम है कि किसी भी तरह से मदद करता है प्राप्त कर सकते हैं। – Nawaz

+0

@ नवाज आप यह कैसे करेंगे? –

+1

@CS .: आपको इन API का उपयोग करना होगा: [SymInitialize] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681351%28v=vs.85%29.aspx) और [SymFromAddr] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681323%28v=vs.85%29.aspx)। मैंने उनका उपयोग किया है, इस विषय को देखें: [किसी अन्य प्रक्रिया से Win32 थ्रेड की स्टार्ट एड्रेस प्राप्त करें] (http://stackoverflow.com/questions/8679406/get-startaddress-of-win32-thread-from-another-process) – Nawaz

उत्तर

12

ऐसा कोई WinAPI कॉल नहीं है क्योंकि थ्रेड नाम जैसी कोई चीज़ मौजूद नहीं है।

यदि आप थ्रेड नाम सेट करते हैं तो आपके आईडीई का डीबगर इसे आपके लिए संग्रहीत करेगा, जिससे डीबग करना आसान हो जाता है। हालांकि नाम विंडोज़ एपीआई कॉल द्वारा थ्रेड से वास्तव में कभी भी जुड़ा हुआ नहीं है।

यदि आप डीबगर के बिना अपना आवेदन चलाते हैं तो थ्रेड नाम सेट करने का कोई प्रभाव नहीं पड़ता है, इसलिए आप नाम पुनर्प्राप्त नहीं कर सकते हैं।

भले ही यह पहुंच योग्य होगा - मैं कोड नहीं लिखूंगा जो केवल डीबगर संलग्न के साथ काम करता है। हैंडल के साथ अपने आप को नाम बेहतर तरीके से स्टोर करें।

+0

क्या आप कह रहे हैं कि डीबगर में सेट थ्रेड नाम प्राप्त करने का बिल्कुल कोई तरीका नहीं है? मैं अपने कोड में कुछ डीबग चेक डालना चाहता हूं ताकि यह सुनिश्चित किया जा सके कि इसे थ्रेड नाम – Arthur

+0

का उपयोग करके सही धागे से कहा जाता है। थ्रेड 0x66c कोड 0 (0x0) -> मैंने सोचा था, शायद 0x66c कुछ ऐसा है एक नाम ? – Andre

17

धागे वास्तव में Win32 में नाम नहीं हैं। RaiseException के माध्यम से प्रक्रिया वीएस डीबगर के साथ सिर्फ "गुप्त हैंडशेक" है, जो वास्तव में टीआईडी ​​=> नाम मैपिंग स्टोर करती है। विंडोज़ के पास धागे "नाम" की कोई धारणा नहीं है।

7

विंडोज 10, संस्करण 1607 के साथ शुरुआत, अब आप GetThreadDescription() का उपयोग करके थ्रेड का नाम प्राप्त कर सकते हैं, मानते हैं कि SetThreadDescription() थ्रेड का नाम सेट करने के लिए उपयोग किया गया था।

यहाँ एक उदाहरण है:

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

यहाँ प्रलेखन है:

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

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