मैं किसी भी एपीआई से अवगत नहीं हूं कि ओएस के शेड्यूलर को जो भी आप चाहते हैं उसे करने के लिए प्राप्त करें (भले ही आपका धागा निष्क्रिय-प्राथमिकता हो, यदि कोई उच्च प्राथमिकता वाले तैयार धागे नहीं हैं, तो आपका भाग जाएगा)। हालांकि, मुझे लगता है कि आप जो कुछ भी कर रहे हैं उसके आधार पर आप एक काफी सुरुचिपूर्ण थ्रॉटलिंग फ़ंक्शन को सुधार सकते हैं। अनिवार्य रूप से (मेरे पास विंडोज़ देव मशीन आसान नहीं है):
प्रत्येक पुनरावृत्ति को थ्रेड करने के लिए डिफ़ॉल्ट समय चुनें। फिर, प्रत्येक पुनरावृत्ति पर (या प्रत्येक nth पुनरावृत्ति पर, जैसे कि थ्रॉटलिंग फ़ंक्शन स्वयं एक महत्वपूर्ण CPU लोड नहीं बनता है)
- पिछली बार आपके थ्रॉटलिंग फ़ंक्शन को कॉल करने के बाद से आपके थ्रेड का उपयोग करने वाले CPU समय की गणना करें (मैं इस डीसीपीयू को कॉल करूंगा)। आप अपने समय की मात्रा प्राप्त करने के लिए GetThreadTimes() API का उपयोग कर सकते हैं धागा निष्पादित कर रहा है।
- पिछली बार आपके थ्रॉटलिंग फ़ंक्शन को कॉल करने के बाद से वास्तविक समय की मात्रा की गणना करें (मैं इस डीक्लॉक को कॉल करूंगा)।
- डीसीपीयू / डीक्लॉक प्रतिशत CPU उपयोग (एक सीपीयू का) है। यदि यह आपकी इच्छा से अधिक है, तो नींद का समय बढ़ाएं, यदि कम हो, तो नींद का समय कम करें।
- गणना के समय के लिए अपना धागा सोएं।
आपके वॉचडॉग CPU उपयोग की गणना कैसे करते हैं, इस पर निर्भर करते हुए, आप का उपयोग करना चाहेंगे GetProcessAffinityMask() यह पता लगाने के लिए कि सिस्टम के कितने CPU हैं। डीसीपीयू / (डीक्लॉक * सीपीयू) उपलब्ध कुल CPU समय का प्रतिशत है।
आपको अभी भी शुरुआती नींद के समय और वृद्धि / कमी राशि के लिए कुछ जादू संख्याएं चुननी होंगी, लेकिन मुझे लगता है कि इस एल्गोरिदम को थ्रेड को निर्धारित CPU के निर्धारित प्रतिशत के करीब चलने के लिए ट्यून किया जा सकता है।