2012-12-27 14 views
6

मेरे पास 2 प्रोजेक्ट हैं। एक एमएफसी स्टाइल के बिना सी ++ बिल्डर द्वारा बनाया गया है। और दूसरा एक वीसी ++ एमएफसी 11.ऑडियो बंद होने पर थ्रेड धीमे होते हैं

जब मैं धागा बनाता हूं और एक चक्र बनाता हूं - मान लीजिए कि यह चक्र Sleep(10) का उपयोग करके 1 से 100 तक प्रगति पट्टी स्थिति में जोड़ता है, यह सी ++ बिल्डर दोनों के लिए निश्चित रूप से काम करता है और सी ++ एमएफसी।

अब, Sleep(10) 10 मिलीसेकंड प्रतीक्षा है। ठीक। लेकिन समस्या केवल तभी होती है जब मेरे पास खुले मीडिया प्लेयर, विनम्प या कुछ भी "ध्वनि" उत्पन्न करता है। अगर मैं सभी मीडिया प्लेयर, विनम्प और अन्य ध्वनि कार्यक्रम बंद करता हूं, तो मेरे धागे 10 मिलीसेकंड से धीमे हो जाते हैं।

यह 50-100 ms/each जैसा लगता है। अगर मैं कोई संगीत खोलता हूं, तो यह सामान्य रूप से काम करता है जैसा कि मैंने उम्मीद की थी।

मुझे कोई जानकारी नहीं है कि यह क्यों हो रहा है। मैंने पहली बार सोचा कि मैंने एमएफसी ऐप के अंदर गलती की है लेकिन सी ++ बिल्डर भी धीमा क्यों है?

और हाँ, मुझे सकारात्मक यकीन है कि यह ध्वनि से संबंधित है क्योंकि मैंने अपनी खिड़कियों को फिर से बनाया है, सब कुछ अक्षम कर दिया है। आखिर में मैंने पाया कि ध्वनि मुद्दा।

क्या मेरे कोड को कुछ चाहिए?

अद्यतन:

अब, मैं कोड का पालन किया और पाया कि मैं 1 मिलीसेकंड प्रतीक्षा करने के लिए इस तरह के क्षेत्रों में Sleep(1) इस्तेमाल किया। इसका कारण, मैं एक वस्तु को बाएं से दाएं स्थानांतरित करता हूं। अगर मैं इस नींद को हटा देता हूं तो चलती दिखाई नहीं दे रही है क्योंकि यह बहुत तेज़ है। तो, मुझे Sleep(1) का उपयोग करना चाहिए। Sleep(1) के साथ, यदि पर पर ऑडियो काम करता है तो यह काम करता है। यदि ऑडियो से बहुत धीमा है, तो ऑडियो बहुत धीमा है।

for (int i = 0; i <= 500; i++) { 
    theDialog->staticText->SetWindowsPosition(NULL, i, 20, 0, 0); 
    Sleep(1); 
} 

तो, इसके बारे में सुझावों की वास्तव में सराहना की जाती है। मुझे क्या करना चाहिए?

मुझे पता है कि यह गलत तरीका है। मुझे कुछ और उपयोग करना चाहिए जो उचित और मान्य है। लेकिन वास्तव में क्या? कौन सा फ़ंक्शन या क्लास स्थिर ग्रंथों को एक स्थिति से दूसरे स्थान पर आसानी से स्थानांतरित करने में मेरी सहायता करता है?

इसके अलावा, प्राथमिकता को बदलने में मदद नहीं मिली है।

अद्यतन 2:

अद्यतन 1 एक एक और सवाल :) कम से कम 10 मिलीसेकंड के लिए

+0

दिलचस्प। जब आप अंतर देखते हैं तो क्या आपकी प्रक्रिया की प्राथमिकता अभी भी वही है? – Brad

+1

प्रक्रियाओं की प्राथमिकताएं समान हैं। दूसरी दिलचस्पी बात यह है कि, यदि मैं मीडिया प्लेयर खोलता हूं (लेकिन संगीत नहीं चलाता) तो मेरा थ्रेड प्रोग्राम 2% CPU और थ्रेड कार्यों के साथ चलता है। अगर मैं मीडिया प्लेयर बंद करता हूं, तो तुरंत धीमा हो जाता है और इसमें 0% सीपीयू लगता है। – xangr

+2

यह सीपीयू की आवृत्ति को थ्रॉटल करने वाले प्रोसेसर के कारण हो सकता है। – johnathon

उत्तर

4

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

अध्याय 7 में माइक्रोसॉफ्ट विंडोज (4 एड), अनुभाग स्लीपिंग के लिए प्रोग्रामिंग अनुप्रयोगों में जेफरी Richters टिप्पणी का संदर्भ लें:

प्रणाली धागा निर्दिष्ट मिलीसेकेंड के लगभग संख्या के लिए schedulable नहीं बनाता है। यह सही है-अगर आप सिस्टम बताते हैं तो आप 100 मिलीसेकंड के लिए सोना चाहते हैं, तो आप लगभग सो लेंगे, लेकिन संभवतः कई सेकंड या मिनट अधिक। याद रखें कि विंडोज रीयल-टाइम ऑपरेटिंग सिस्टम नहीं है। आपका धागा शायद सही समय पर जाग जाएगा, लेकिन चाहे यह सिस्टम पर चल रहा है, इस पर निर्भर करता है।

MSDN Multimedia Class Scheduler Service (Windows) प्रति

MMCSS रूप

भी कि समय के प्रति संवेदनशील प्रसंस्करण CPU संसाधनों को प्राथमिकता के आधार पर पहुँच प्राप्त करता है सुनिश्चित करता है।

ऊपर प्रलेखन के अनुसार, आप भी CPU संसाधनों है कि कम प्राथमिकता वाले कार्यों की गारंटी दी जाएगी, एक रजिस्ट्री कुंजी timeBeginPeriod() साथ

4

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

+0

मुझे यकीन है कि वह इसके बारे में जानता है। प्रश्न यह है कि क्वांटम के आकार पर इतना बड़ा प्रभाव पड़ता है या यदि यह सिर्फ यादृच्छिक मौका है। समस्या के आधार पर "इसे संवेदना से संभाल लें" प्रश्न से बाहर है (उदा। ऑडियो या वीडियो रीप्ले)। – Voo

+0

@Voo सही है। मुझे इसके बारे में पता है।आईडीई स्थापित करने के बाद मैं 'SetSystemPowerState()' फ़ंक्शन का उपयोग करके इस समस्या को हल करने का प्रयास करूंगा। – xangr

+0

@Voo: वह प्रगति पट्टी की स्थिति अपडेट कर रहा है। समझदारी से इसे संभालना लगभग मामूली है। –

2

Sleep() समय के लिए न्यूनतम संकल्प सेट किया गया है प्रणाली विस्तृत के माध्यम से का प्रतिशत नियंत्रित कर सकते हैं और timeEndPeriod()। उदाहरण के लिए timeBeginPeriod(1) गुजरने के लिए न्यूनतम संकल्प 1 एमएस सेट करता है। ऐसा हो सकता है कि ऑडियो प्रोग्राम संकल्प को 1 एमएस तक सेट कर रहे हैं, और इसे पूरा होने पर 10 एमएस से अधिक कुछ बहाल कर रहे हैं। मुझे एक प्रोग्राम के साथ समस्या थी जो Sleep(1) का उपयोग करता था जो XE2 IDE चल रहा था, लेकिन केवल 12 एमएस के लिए सोते समय ठीक काम करता था। मैंने अपने कार्यक्रम की शुरुआत में सीधे timeBeginPeriod(1) सेट करके समस्या हल की।

देखें: http://msdn.microsoft.com/en-us/library/windows/desktop/dd757624%28v=vs.85%29.aspx

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