2009-03-02 15 views
23

Im tratando de cambiar la prioridad de subprocesos en el impulso, pero no tengo suerte. Recibo un error de manejo incorrecto (tipo 6) de la función GetLastError. ¿Pensé que native_handle() devolvió el identificador para el hilo?Cambiar la prioridad de subprocesos de subprocesos en Windows

¿Alguien sabe cómo hacer esto?

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 
} 

edición: código 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 
} 

Respuesta

18

función Uso SetThreadPriority para establecer la prioridad hilo. SetPriorityClass se usa para establecer la prioridad del proceso. También debe cambiar los valores de prioridad; consulte la documentación del SetThreadPriority para obtener más información.

+0

que fue un error estúpido. Lo intentaré ahora. Gracias – Lodle

3

La función SetPriorityClass toma como primer parámetro un HANDLE, está pasando un puntero a un HANDLE. Cámbialo a:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

o algo equivalente. El kernel puede decir que el valor del puntero que pasó no es realmente un identificador de subproceso válido porque supongo que mantiene una lista interna de identificadores de subproceso asignados actualmente. El puntero obviamente no está en esa lista. El compilador realmente no puede imponer un tipo de seguridad mejor, ya que un MANILLAR es un tipo opaco, solo tienes que tener mucho cuidado con lo que pasas.

Ah, por cierto, el otro comentarista Dani es correcto, SetPriorityClass no se utiliza para establecer la prioridad de un hilo, de todos modos quiere usar SetThreadPriority. Pero entonces mi consejo seguiría en pie, necesitas pasar un MANGO, no un puntero a eso.

+0

La cuestión del puntero era que yo estaba jugando con el código de antemano y no lo arreglaba. Pero gracias por tu ayuda de cualquier manera. :PAG – Lodle

Cuestiones relacionadas