Question

Je suis en train d'essayer de changer la priorité du thread en boost mais je n'ai pas de chance. Je reçois une erreur de type poignée (type 6) de la fonction GetLastError. Je pense que native_handle () a retourné le handle du thread?

Quelqu'un sait comment faire cela?

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
}

modifier: code final:

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
}
Était-ce utile?

La solution

Utilisez la fonction SetThreadPriority pour définir la priorité du thread. SetPriorityClass est utilisé pour définir la priorité du processus. Vous devez également modifier les valeurs de priorité, voir la documentation de SetThreadPriority pour plus de détails.

Autres conseils

La fonction SetPriorityClass prend comme premier paramètre un HANDLE, vous passez un pointeur sur un HANDLE. Changez-le en:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);

ou quelque chose d'équivalent. Le noyau peut dire que la valeur du pointeur que vous avez transmise n'est pas vraiment un handle de thread valide car je suppose qu'il maintient une liste interne des handles de thread actuellement alloués. Le pointeur n'est évidemment pas dans cette liste. Le compilateur ne peut pas vraiment appliquer une meilleure sécurité de type, puisqu'un HANDLE est en quelque sorte un type opaque - vous devez juste faire très attention à ce que vous transmettez.

Oh au fait, l’autre intervenant Dani est correct, SetPriorityClass n’est pas utilisé pour définir la priorité d’un thread, vous voulez quand même utiliser SetThreadPriority . Mais alors, mon conseil serait toujours valable, vous devez passer un HANDLE, pas un pointeur vers un tel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top