2009-03-02 15 views
23

में बढ़ावा धागा प्राथमिकता इम बढ़ावा में धागा प्राथमिकता बदलने की कोशिश कर रहा है, लेकिन im कोई किस्मत हो रही है। मुझे GetLastError फ़ंक्शन से खराब हैंडल त्रुटि (प्रकार 6) मिल रही है। हालांकि मैं देशी_handle() धागे के लिए हैंडल वापस कर दिया?बदलें विंडोज

किसी भी एक को पता है कि यह कैसे करना है?

void baseThread::applyPriority(uint8 priority) 
{ 

#ifdef WIN32 
    if (!m_pThread) 
     return; 

    BOOL res; 
    HANDLE th = m_pThread->native_handle(); 

    switch (priority) 
    { 
    case REALTIME : res = SetPriorityClass(th, REALTIME_PRIORITY_CLASS);  break; 
    case HIGH  : res = SetPriorityClass(th, HIGH_PRIORITY_CLASS);   break; 
    case ABOVE_NORMAL : res = SetPriorityClass(th, ABOVE_NORMAL_PRIORITY_CLASS); break; 
    case NORMAL  : res = SetPriorityClass(th, NORMAL_PRIORITY_CLASS);   break; 
    case BELOW_NORMAL : res = SetPriorityClass(th, BELOW_NORMAL_PRIORITY_CLASS); break; 
    case IDLE  : res = SetPriorityClass(th, IDLE_PRIORITY_CLASS);   break; 
    } 

    if (res == FALSE) 
    { 
     int err = GetLastError(); 
    } 

#endif 
} 

संपादित करें: फाइनल कोड:

void baseThread::applyPriority(uint8 priority) 
{ 

#ifdef WIN32 
    if (!m_pThread) 
     return; 

    BOOL res; 
    HANDLE th = m_pThread->native_handle(); 

    switch (priority) 
    { 
    case REALTIME  : res = SetThreadPriority(th, THREAD_PRIORITY_TIME_CRITICAL); break; 
    case HIGH   : res = SetThreadPriority(th, THREAD_PRIORITY_HIGHEST);   break; 
    case ABOVE_NORMAL : res = SetThreadPriority(th, THREAD_PRIORITY_ABOVE_NORMAL); break; 
    case NORMAL   : res = SetThreadPriority(th, THREAD_PRIORITY_NORMAL);   break; 
    case BELOW_NORMAL : res = SetThreadPriority(th, THREAD_PRIORITY_BELOW_NORMAL); break; 
    case IDLE   : res = SetThreadPriority(th, THREAD_PRIORITY_LOWEST);   break; 
    } 

#endif 
} 

उत्तर

18

उपयोग SetThreadPriority समारोह धागा प्राथमिकता निर्धारित करने के लिए। SetPriorityClass का उपयोग प्रक्रिया की प्राथमिकता को निर्धारित करने के लिए किया जाता है। तुम भी प्राथमिकता मूल्यों को बदलने के लिए, जानकारी के लिए SetThreadPriority के लिए दस्तावेज़ देखें है।

+0

जो एक बेवकूफ त्रुटि थी। मैं इसे अभी जाना चाहता हूँ। धन्यवाद – Lodle

3

SetPriorityClass समारोह लेता है के रूप में यह पहले पैरामीटर एक हैंडल है, तो आप एक को संभालने के लिए एक सूचक में गुजर रहे हैं। इसे बदलें:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

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

ओह वैसे, अन्य टिप्पणीकर्ता दानी सही है, SetPriorityClass एक धागा की प्राथमिकता स्थापित करने के लिए नहीं किया जाता है, तुम वैसे भी SetThreadPriority उपयोग करना चाहते हैं। लेकिन फिर मेरी सलाह अभी भी खड़े हैं, तो आप, नहीं एक सूचक इस तरह के एक हैंडल में पारित करने के लिए की जरूरत है।

+0

पॉइंटर चीज मुझे कोड से पहले गड़बड़ कर रही थी और इसे ठीक नहीं कर रही थी। लेकिन आपकी मदद के लिए धन्यवाद। : पी – Lodle

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