2010-05-19 13 views
6
if (reader.is_lazy()) goto tldr; 

है मुझे लगता है कि कुछ आई/ओ गहन पृष्ठभूमि प्रकार काम करता है एक पृष्ठभूमि धागा है।निर्धारित करें यदि वर्तमान धागा कम आई/ओ प्राथमिकता

SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); 

हालांकि, THREAD_MODE_BACKGROUND_BEGIN विंडोज सर्वर 2008 या नए में ही उपलब्ध है, साथ ही Windows Vista: अन्य धागे और चल रही प्रक्रियाओं को खुश करने के लिए, मैं धागा प्राथमिकता करने के लिए "पृष्ठभूमि मोड" SetThreadPriority उपयोग करते हुए, इस तरह सेट और नया, लेकिन प्रोग्राम को विंडोज सर्वर 2003 और एक्सपी पर भी अच्छी तरह से काम करने की जरूरत है। तो असली कोड इस तरह अधिक है:

if (!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN)) { 
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); 
} 

इस के साथ समस्या यह है कि Windows XP पर यह पूरी तरह से बहुत ज्यादा आई/ओ का उपयोग करके प्रणाली को बाधित करेगा है। मेरे पास इस समस्या को कम करने के बदसूरत और शर्मनाक तरीके की योजना है, लेकिन यह मुझ पर निर्भर करता है कि यह निर्धारित करने में सक्षम है कि वर्तमान धागे में कम I/O प्राथमिकता है या नहीं।

अब, मुझे पता है कि मैं कौन सी धागा प्राथमिकता को स्टोर कर सकता हूं, स्टोर कर सकता हूं, लेकिन कार्यक्रम में नियंत्रण प्रवाह वास्तव में इसके लिए उपयुक्त नहीं है। मैं बाद में परीक्षण करने में सक्षम होना चाहूंगा कि वर्तमान धागे में कम I/O प्राथमिकता है या नहीं - यदि यह "पृष्ठभूमि मोड" में है।

tldr: 

GetThreadPriority मुझे यह जानकारी देने के लिए प्रतीत नहीं होता है, तो वह केवल सीपीयू प्राथमिकता देती है।

क्या यह निर्धारित करने का कोई तरीका है कि वर्तमान धागे में कम I/O प्राथमिकता है या नहीं?

+0

कैसे GetThreadPriority काम नहीं करता है? – Goz

+0

@Goz: यह केवल सीपीयू प्राथमिकता देता है। मैंने इसे शामिल करने के लिए प्रश्न को अद्यतन किया। –

+0

मैं देखता हूं ... दिलचस्प। – Goz

उत्तर

3

वैसे यह विफल रहता है अगर आप इसे पहले ही पृष्ठभूमि मोड में सेट कर चुके हैं। क्या आप इस पर निर्भर कर सकते हैं कि आप इसे पृष्ठभूमि प्रसंस्करण के लिए चाहते हैं, न केवल पृष्ठभूमि को प्राथमिकता सेट करें और देखें कि यह विफल रहता है या नहीं?

यदि आप उम्मीद करते हैं/चाहते हैं तो आप पृष्ठभूमि अंत को कॉल करके परीक्षण कर सकते हैं।

यदि यह आपके लिए अच्छा नहीं है तो आप शायद पृष्ठभूमि मोड में हैं या नहीं, यह स्टोर करने के लिए थ्रेड स्थानीय संग्रहण का उपयोग करके सबसे अच्छा होगा।


संपादित मैगनस हॉफ द्वारा: यह मैं इसे कैसे लागू करने समाप्त हो गया है:

bool has_low_io_priority() { 
    if (SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN)) { 
     // Seems we were able to enter background mode. That means we were 
     // not in background mode from before. 
     SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END); 
     return false; 
    } else { 
     DWORD err = GetLastError(); 
     if (err == ERROR_THREAD_MODE_ALREADY_BACKGROUND) return true; 
     else return false; //< Background mode is not available at all 
    } 
} 

निर्माण अच्छी तरह से :)

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