2010-10-18 8 views
5

_beginthreadex एक हैंडल देता है एक धागा करने के लिए:क्या मुझे थ्रेड हैंडल() को थ्रेड हैंडल पर बंद करना चाहिए?

m_hStreamStatsThread = (HANDLE) _beginthreadex(NULL, 0, StreamStatsThread, this, 0, NULL); 

इस संभाल यदि आप उदाहरण के लिए TerminateThread की तरह कॉल में धागा (..) का उल्लेख करने की जरूरत है इस्तेमाल किया जा सकता है।

the MSDN page on _beginthreadex के अनुसार, _beginthreadex हमेशा वैध संभाल नहीं देगा - उदा। यह त्रुटि आदि पर -1L भी लौटा सकता है

जब कोई थ्रेड सामान्य रूप से पूरा हो जाता है, तो क्या मुझे थ्रेड हैंडल पर क्लोजहैंडल को कॉल करना होगा, या क्या मैं अपना मान NULL/INVALID_HANDLE_VALUE पर सेट कर सकता हूं?

उत्तर

9

निमेंजा त्रिफुनोविक के साथ सहमत हैं।

थ्रेड से बाहर निकलने के बाद भी - इसका संभाल मान्य है। उदाहरण के लिए आप इसके वापसी मूल्य पूछ सकते हैं।

एक सामान्य नियम के रूप में: प्रत्येक Win32 हैंडल को CloseHandle द्वारा बंद किया जाना चाहिए, जब तक कि अन्यथा निर्दिष्ट न किया जाए।

+2

कोई भी Win32 * कर्नेल * हैंडल (यानी कुछ भी है जो 'हैंडल' प्रकार है)। WinAPI के साथ काम करने वाले किसी व्यक्ति के लिए स्पष्ट है, लेकिन मैंने लोगों को 'CloseHandle' के साथ विंडोज/संसाधन हैंडल ('HWND',' HICON', ...) को बंद करने का प्रयास किया है। :) –

+1

हाँ, आप सही हैं। बिंदु कर्नेल हैंडल बंद करना है। उन HWND, HICON, HCURSOR और आदि उपयोगकर्ता हैंडल हैं। – valdo

+1

पीएस उपयोगकर्ता हैंडल - मेरा मतलब था - उपयोगकर्ता 32 द्वारा समर्थित हैंडल। – valdo

3

आपके द्वारा लिंक पोस्ट किए गए एमएसडीएन पृष्ठ पर कोड नमूना CloseHandle() पर कॉल शामिल है। हैंडल के मान को एनयूएलएल में सेट करना कर्नेल ऑब्जेक्ट की आंतरिक रेफ गिनती को कम नहीं करता है और वैसे भी काफी बेकार है।

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