سؤال

أحاول تغيير أولوية الموضوع في التعزيز ولكن لم يحالفني الحظ.أتلقى خطأ مقبض غير صالح (النوع 6) من وظيفة GetLastError.على الرغم من أن original_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
}
هل كانت مفيدة؟

المحلول

استخدم وظيفة SetThreadPriority لتعيين أولوية مؤشر الترابط.يتم استخدام SetPriorityClass لتعيين أولوية العملية.يجب عليك أيضًا تغيير قيم الأولوية، راجع وثائق تعيين أولوية الموضوع للتفاصيل.

نصائح أخرى

وظيفة SetPriorityClass يأخذ كما انها الاولى المعلمة مقبض، التي يتم تمريرها في مؤشر إلى مقبض. تغييره إلى:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);

وأو شيء ما يعادلها. نواة يمكن أن نقول أن قيمة المؤشر الذي تم تمريره في ليست في الحقيقة التعامل مع موضوع صحيح لأنني اعتقد انه يحافظ على قائمة داخلية مقابض موضوع المخصصة حاليا. المؤشر ليس من الواضح في تلك القائمة. المترجم لا يمكن أن تنفذ حقا تحسين السلامة نوع، لأن HANDLE هو نوع من نوع مبهمة - عليك أن تكون حذرا حقا ما كنت تمر في

ويا وبالمناسبة، المعلق الآخر داني هو الصحيح، لا يتم استخدام SetPriorityClass لتحديد أولوية موضوع، تريد استخدام SetThreadPriority على أي حال. ولكن بعد ذلك نصيحتي لا تزال قائمة، تحتاج إلى تمرير في التعامل معها، لا مؤشر إلى هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top