2012-03-16 26 views
7

1.I में एक infinte पाश होने सबसे कम CPU खपत पाने के लिए कुछ infinte लूप कैसे मैं सबसे कम CPU खपत प्राप्त कर सकते हैं? क्या मुझे देरी का उपयोग करना चाहिए?कैसे जब एक धागा

2. यदि मैं एक से अधिक थ्रेड अपने आवेदन में चल रहा है और उनमें से एक THREAD_PRIORITY_IDLE यह अन्य धागे को प्रभावित करता है है?

मेरे कोड हर धागा

procedure TMatchLanLon.Execute; 
begin 
while not Terminated do 
    begin 
      //some code 
      Sleep(1000); 
    end; 
end; 
+0

कृपया अपना डेल्फी संस्करण जोड़ें। धागे से संबंधित प्रश्नों के लिए यह महत्वपूर्ण है। – TLama

+0

@TLama मेरा डेल्फी संस्करण XE2 – opc0de

+1

[अपने स्वयं के प्रश्न] का डुप्लिकेट (http://stackoverflow.com/questions/9715378/infinite-loops-in-separate-threads "अलग-अलग धागे में अनंत लूप")? –

उत्तर

9

आमतौर पर जब तक संकेत एक धागा सो जाना चाहिए, लेकिन नहींSleep या SleepEx प्रयोग करने के लिए इस रूप में है।

आप एक ईवेंट बनाते हैं और इसे TEvent का उपयोग करके या WaitForSingleObject के साथ Win32 API पर निर्देशित करने के लिए प्रतीक्षा करें।

Sleep सहित मैं "स्लीपिंग ब्यूटी" क्या कॉल रोग तो कई समस्याओं का कारण बनता है। अपने आवेदन के पूरे आराम के समाप्त कर दिया है और कुछ सौ microseconds पहले शट डाउन, और अपने धागा एक "लाख साल" सापेक्ष कंप्यूटर समय मामले में के लिए सोया है, और जब वह अपने आवेदन के बाकी जाग कब से समाप्त कर दिया है। अगली बात यह है कि आपकी पृष्ठभूमि धागा करने की संभावना है, उस वस्तु को एक्सेस करें जिसमें इसका संदर्भ है, जो जमे हुए थे, और फिर (यदि आप भाग्यशाली हैं) तो यह क्रैश हो जाएगा। धागे में Sleep का उपयोग न करें। घटनाओं की प्रतीक्षा करें, या कुछ पूर्व-निर्मित कार्यकर्ता थ्रेड का उपयोग करें (जैसे OmniThreadLibrary एक)।

+4

यदि आपका धागा कोड (नींद के अलावा) निष्पादित कर रहा है, तो एप्लिकेशन को समाप्त होने के बाद भी ऐसा हो सकता है। एक साधारण लूप या जटिल ऑपरेशन में सेकंड भी लग सकते हैं जिसके दौरान शेष एप्लिकेशन के साथ कोई बातचीत नहीं होती है। तो उस अर्थ में नींद खराब नहीं है। यदि आपका धागा नींद के बाद दुर्घटनाग्रस्त हो जाता है, तो यह किसी अन्य ऑपरेशन के बाद (या उसके दौरान) भी क्रैश हो सकता है। कोई बात नहीं कि धागे में नींद का उपयोग करना अच्छा है, लेकिन आपके द्वारा वर्णित कारण या तो नहीं है। – GolezTrol

+4

विंडोज किसी भी संसाधन को हटाने से पहले सभी निकास को एप्लिकेशन से बाहर निकलने पर रोक देता है। नींद() धागे में ठीक है - मैं इसका उपयोग कर रहा हूं, (इसके उचित उद्देश्यों के लिए, एक कॉमर्स-चुनौतीपूर्ण एप्लिकेशन में मतदान कचरे के रूप में नहीं) दशकों से। –

+0

'यदि आपका धागा कोड (नींद के अलावा) निष्पादित कर रहा है, तो एप्लिकेशन को समाप्त होने के बाद भी ऐसा हो सकता है' - नहीं, यह नहीं हो सकता है। सभी धागे या तो उनके राज्य सेट होते हैं ताकि वे कभी भी फिर से दौड़ न सकें या अगर बाहर निकलने वाले किसी भी अलग कोर पर चल रहे हों, तो उनके प्रोसेसर को रोकने के लिए बाधा डालें। जब सभी धागे बंद हो जाते हैं, तो संसाधनों को हटा दिया जाता है। –

6

मेरे पास कुछ infinte loops है मैं सबसे कम cpu खपत कैसे प्राप्त कर सकता हूं?

पाश अवरुद्ध तक वहां कुछ करने के लिए है के द्वारा।

यदि मेरे पास मेरे एप्लिकेशन में एकाधिक थ्रेड चल रहे हैं और उनमें से एक है THREAD_PRIORITY_IDLE क्या यह अन्य धागे को प्रभावित करता है?

..depends। शायद नहीं, लेकिन यदि कोई अन्य थ्रेड इस थ्रेड से आउटपुट पर इंतजार कर रहा है, या उससे लॉक की रिहाई है, तो अन्य थ्रेड प्रभावी रूप से THREAD_PRIORITY_IDLE पर 'ड्रैग डाउन' होते हैं। इस प्राथमिकता-उलट, (जो गतिरोध पैदा कर सकता है धागे कई प्राथमिकता स्तर है जब), spinlocks, एक तुल्यकालन निर्माण कि सामान्य रूप से केवल बुरा है से
अलावा, विनाशकारी हो सकता है।

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