Modifier la priorité du thread boost dans Windows

J'essaie de changer la priorité du thread dans boost mais je n'ai pas de chance. Im obtenir une mauvaise erreur de poignée (type 6) de la fonction GetLastError. Je pense que native_handle () a retourné le handle pour le thread?

Quelqu'un sait comment faire?

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
}
23
demandé sur larsmoa 2009-03-02 08:17:29

2 réponses

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.

18
répondu Dani van der Meer 2009-03-02 05:46:44

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 threads 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, car une poignée est une sorte de type opaque-il suffit de être vraiment attention à ce que vous transmettez.

Oh, en passant, l'autre intervenant Dani est correct, SetPriorityClass n'est pas utilisé pour définir la priorité d'un thread, vous souhaitez utiliser SetThreadPriority, de toute façon. Mais alors mon conseil serait toujours debout, vous devez passer dans une poignée, pas un pointeur vers un tel.

3
répondu 1800 INFORMATION 2009-03-02 05:53:26