/ Win32 / MFC में एक थ्रेड रोकना - c ++, मल्टीथ्रेडिंग, वाइनपी, mfc

Win32 / MFC - c ++, multithreading, winapi, mfc में थ्रेड रोकना

मैं कुछ थ्रेडिंग संबंधित कोड के माध्यम से पढ़ रहा था और इस कोड का टुकड़ा मिला:

MyThread::start()
{
//Create a thread
m_pThread = AfxBeginThread(/*some parameters*/)

//Create a duplicate handle for the created thread
m_hDuplicateHandle = DuplicateHandle(/* some more parameters*/)
}

MyThread::stop()
{
//Set some variables so that the thread comes out of its run() function
WaitForSingleObject(m_hDuplicateHandle, defaultTimeout);

CloseHandle(m_hDuplicateHandle);
}

मेरा प्रश्न, डुप्लिकेट हैंडल की आवश्यकता क्यों है? क्या हम मूल धागे के हैंडल पर सीधे इंतजार नहीं कर सकते? क्या यह किसी तरह अमान्य है?

उत्तर:

जवाब के लिए 8 № 1

AfxBeginThread एक रिटर्न देता है CWinThread* और MFC मानता है कि यह थ्रेड से जुड़े हैंडल का प्रबंधन करेगा।

तो सुरक्षित रूप से हैंडल का उपयोग करने के लिए आपको सीधे इसे डुप्लिकेट करने की आवश्यकता होती है, अन्यथा जब थ्रेड समाप्त होता है तो आपके द्वारा WaitForSingleObject कॉल करने से पहले MFC हैंडल को बंद कर सकता है।

यदि आप सीधे win32 CreateThread API के साथ काम कर रहे थे, तो आप निश्चित रूप से सीधे दिए गए हैंडल पर प्रतीक्षा कर सकते हैं।


जवाब के लिए 2 № 2

CW_Tread का m_hTread सदस्य केवल बंद हैCWinThread ऑब्जेक्ट के विनाश में। यदि यह m_bAutoDelete TRUE पर सेट है, तो ऑब्जेक्ट स्वयं हटा देगा। थ्रेड अपने आप इसे हटा देगा क्योंकि यह वर्कर का फंक्शन या मैसेज लूप आदि खत्म हो जाता है, _AfxThreadEntry देखें। अमान्य डुप्लिकेट का उपयोग करने से बचने या अमान्य CWinThread * का उपयोग करने से बचने के लिए डुप्लिकेट होने का कारण * यदि थ्रेड बाहर निकलता है और स्टॉप से ​​पहले नष्ट हो जाता है () कहा जाता है।