2009-05-22 21 views
7

के तहत थ्रेड को निलंबित कर दिया गया है, क्या मुझे सीई या विजुअल सी ++ का उपयोग करके, सीई या विजुअल सी ++ का उपयोग किए बिना विंडोज सीई के तहत एक थ्रेड निलंबित कर सकता है, फिर से काम करने या निलंबित कार्यों के बिना? एक ही तरीका है इसे करने में मुझे देख सकते हैं की तरहमुझे कैसे पता चलेगा कि विंडोज सीई

int Count = SuspendThread(ThreadHandle); 
ResumeThread(ThreadHandle); 

यह कुछ समस्याओं की एक जोड़ी है, सबसे पहले है, मैं नहीं बल्कि धागा निलंबित नहीं चाहते हैं, और दूसरी बात को निलंबित असफल हो सकता है अगर धागा कर्नेल कोड चल रहा है । मैं इसके आसपास काम कर सकता हूं, लेकिन मुझे लगता है कि एक और अधिक सुरुचिपूर्ण समाधान होना चाहिए। मैं इसे

int Count = ResumeThread(ThreadHandle); 
SuspendThread(ThreadHandle); 

का उपयोग करके इसे उलट भी सकता है लेकिन इसमें समान समस्याएं हैं। हैंडल से निलंबन गिनती प्राप्त करने का कोई भी अच्छा वैकल्पिक तरीका?

उत्तर

4

मेरे पास एक संयुक्त समाधान है। थ्रेड को निलंबित कर दिया गया है या नहीं, यह निर्धारित करने के लिए WaitForSingleObject() का उपयोग करें।

यदि यह निलंबित नहीं कर रहा है, को निलंबित गिनती स्पष्ट रूप से 0.

यदि यह निलंबित है, है SuspendThread कॉल करने के लिए सुरक्षित() गिनती निलंबित प्राप्त करने के लिए है यह। चूंकि यह पहले से ही निलंबित कर दिया गया है, इसलिए आप कुछ भी रोक नहीं पाएंगे।

+0

हाँ, यह करने का यही एकमात्र तरीका है। – ctacke

+0

दिलचस्प जवाब। कितने समय तक इंतजार करेंगे, सभी मामलों में 1 एमएमएस पर्याप्त होगा, या क्या यह धीमी होने के लिए उत्तरदायी है? –

+0

असल में मुझे लगता है कि आप प्रतीक्षा समय का उपयोग कर सकते हैं 0. WaitForSingleObject() राज्य का परीक्षण करेगा और तुरंत लौट आएगा। आप केवल WAIT_OBJECT_0 के विरुद्ध वापसी मूल्य की जांच करने में रुचि रखते हैं।जो आपको बताएगा कि धागा राज्य संकेतित है और इसलिए निलंबित नहीं किया गया है। – ralphtheninja

0

शायद WaitForSingleObject के साथ आप जांच सकते हैं कि थ्रेड निलंबित कर दिया गया है लेकिन आप निलंबन काउंटर को पुनर्प्राप्त नहीं कर सकते हैं।

0

यहां तक ​​कि सक्रिय में थ्रेड भी आपको एक WAIT_TIMEOUT परिणाम प्राप्त होगा, क्योंकि यह थ्रेड केवल सिग्नल करते समय सिग्नल करते हैं, जब वे चल रहे होते हैं।

ने कहा कि WaitForSingleObject (hThread, INFINITE) धागे खत्म होने तक प्रतीक्षा करता है।

+0

यही कारण है कि प्रस्तावित इंतजार 0 के लिए था, INFINITE नहीं। – ctacke

1

आपको किसी प्लेटफ़ॉर्म पर किसी भी थ्रेड को निलंबित नहीं करना चाहिए।

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

धागे पर निम्न कार्रवाई किसी भी प्रोग्रामर के लिए, पर प्रतिबंध लगा दिया जाना चाहिए एकमुश्त, किसी भी मंच से:

  • को निलंबित
  • फिर से शुरू (जब से तुम इसकी आवश्यकता नहीं है यदि आप धागा निलंबित नहीं कर सकता)
  • को मार डालो/बीच में बंद करें

तुम कभी, कभी, जबरन अपनी इच्छा के बाहर से एक धागे पर लागू करना चाहिए। आपको कोई गारंटी नहीं है कि यह क्या कर रहा है, वर्तमान में यह किस प्रकार के संसाधन लॉक कर रहा है।

हमेशा एक सहकारी मोड में थ्रेडिंग लिखें। आपके धागे को इसके आसपास के बारे में पता होना चाहिए, और बाहर की दुनिया की इच्छाओं को व्यवस्थित रूप से बाहर निकलने के लिए उपज देना चाहिए, या जब तक यह सुरक्षित रूप से जारी नहीं हो जाता तब तक रोकें।

+0

इसी तरह एक प्रतीक्षा में INFINITE का उपयोग कभी नहीं होना चाहिए। – ctacke

+0

मैं पूरी तरह से सहमत हूं, यह एक लटकने का इंतजार कर रहा है। –

+0

+1, बहुत कठिन डिबगिंग के बाद, मैंने सभी सस्पेंड/रेज़्यूमे कॉल को हटा दिया, और सभी सिंक ऑब्जेक्ट्स को कम से कम एक थ्यूट्स के बीच संचार स्टैक उपयोग से जुड़े एक म्यूटेक्स को कम कर दिया। –

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