2010-02-04 9 views
9

मेरे पास एक Win32 देशी VC++ एप्लिकेशन है जो WinMain() दर्ज करने पर एक अलग धागा शुरू करता है, फिर कुछ उपयोगी काम करता है जबकि वह अन्य थ्रेड चल रहा है, तो बस WinMain() से बाहर निकलता है - अन्य धागा स्पष्ट रूप से बंद नहीं होता है।क्या Win32 एप्लिकेशन से बाहर निकलने से पहले सभी थ्रेड को स्पष्ट रूप से रोकना आवश्यक है?

This blog post कहता है कि इस मामले में एक .NET अनुप्रयोग समाप्त नहीं होगा क्योंकि अन्य थ्रेड अभी भी चल रहा है। क्या यह देशी Win32 अनुप्रयोगों पर भी लागू होता है?

क्या मुझे बाहर निकलने से पहले सभी धागे को रोकना है?

उत्तर

7

हाँ तुम हो, अन्यथा आपके आवेदन लटका कर सकते हैं। मैं इस विषय पर रेमंड चेन के उत्कृष्ट ब्लॉग पोस्ट पढ़ने की सलाह देते:

2

नहीं है, जब रिटर्न WinMain, प्रक्रिया को समाप्त कर दिया जाएगा, और इसका मतलब है कि प्रक्रिया द्वारा उत्पन्न सभी धागे को समाप्त किया जाना चाहिए, हालांकि वे शानदार ढंग से बंद नहीं हो सकते हैं।

हालांकि, यह संभव है कि अन्य थ्रेड चलने पर प्राथमिक थ्रेड समाप्त हो जाए, जिसके परिणामस्वरूप एप्लिकेशन अभी भी चल रहा है। यदि आप WinMain में ExitThread (exit या ExitProcess) पर कॉल करते हैं, और वहां धागे चल रहे हैं (अंततः प्राथमिक धागे द्वारा बनाए गए), तो आप इस व्यवहार को देख सकते हैं। फिर भी, WinMain में वापस लौटें ExitProcess पर कॉल करेंगे, और इसका मतलब है कि सभी धागे को समाप्त किया जाना चाहिए।

अगर यह गलत है तो मुझे सही करें।

+0

यहां दिया गया स्पष्टीकरण 100% सही है। मैंने इसे प्रमाणित किया है कि WinMain थ्रेड सी रनटाइम द्वारा बनाया गया है और जब थ्रेड सी रनटाइम से बाहर निकल गया जिसे एक्जिटप्रोसेस कहा जाता है जिसके कारण पूरे एप्लिकेशन को समाप्त कर दिया जाता है (अन्य थ्रेड सहित)। –

3

यह की कमी है: एक देशी Win32 प्रक्रिया समाप्त करने के लिए के लिए, दो स्थितियों में से एक पूरी होनी चाहिए:

  • किसी ने कॉल ExitProcess या TerminateProcess।
  • सभी थ्रेड बाहर निकलें (उनके थ्रेडप्रोक से लौटकर (WinMainEntryPoint सहित जो विंडोज़ द्वारा बनाए गए पहले थ्रेड हैं), बंद करें (ExitThread को कॉल करके), या समाप्त हो गया है (कोई टर्मिनेट थ्रेड कहता है)।

(पहली शर्त वास्तव में दूसरी है: निकासप्रोसेस और टर्मिनेट प्रोसेस, उनके सफाई के हिस्से के रूप में, कॉल टर्मिनेट प्रक्रिया में प्रत्येक थ्रेड पर थ्रेड दोनों)।

सी क्रम अलग अलग परिस्थितियों आरोपित करता है: समाप्त करने के लिए एक सी के लिए/सी ++ आवेदन, आपको या तो: मुख्य (या WinMain) से

  • वापसी।
  • कॉल से बाहर निकलें()

बाहर निकलने के कॉलिंग() या मुख्य से लौट() दोनों सी क्रम ExitProcess कॉल करने के लिए कारण()।सी & सी ++ अनुप्रयोगों को उनके धागे को साफ किए बिना बाहर निकलें। मैं, व्यक्तिगत रूप से सोचता हूं कि यह एक बुरी बात है।

हालांकि, गैर तुच्छ Win32 प्रक्रियाएं कभी समाप्त नहीं हो सकती हैं क्योंकि कई पूरी तरह से, अन्यथा उचित, Win32 उपप्रणाली कार्यकर्ता धागे बनाते हैं। winsock, ओले, आदि। और उन धागे को स्वचालित रूप से बंद करने के लिए कोई रास्ता नहीं प्रदान करते हैं।

0

मुझे लगता है कि आप पहले अपनी सभी विंडो बंद कर सकते हैं (इसलिए उपयोगकर्ता आपका आवेदन नहीं देखेगा), और फिर बाहर निकलने के लिए ध्वज सेट करें, आपके धागे को समय-समय पर ध्वज की जांच करनी चाहिए, और एक बार सेट हो जाने पर, थ्रेड वापस आना चाहिए ।

ध्वज सेट करने के बाद, आपका मुख्य धागा थोड़ी देर के लिए :: WaitForSingleObject() या :: WaitForMultipleObjects() को कॉल कर सकता है (कहें, तीन सेकंड), अगर धागे वापस नहीं आते हैं, तो बस उन्हें :: TerminateThread()।

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

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