Compartir a través de


Función SetThreadPriority (processthreadsapi.h)

Establece el valor de prioridad del subproceso especificado. Este valor, junto con la clase de prioridad del proceso del subproceso, determina el nivel de prioridad base del subproceso.

Sintaxis

BOOL SetThreadPriority(
  [in] HANDLE hThread,
  [in] int    nPriority
);

Parámetros

[in] hThread

Identificador del subproceso cuyo valor de prioridad se va a establecer.

El identificador debe tener el derecho de acceso THREAD_SET_INFORMATION o THREAD_SET_LIMITED_INFORMATION . Para obtener más información, consulte Derechos de acceso y seguridad de subprocesos. Windows Server 2003: El identificador debe tener el derecho de acceso THREAD_SET_INFORMATION.

[in] nPriority

Valor de prioridad del subproceso. Este parámetro puede ser uno de los valores siguientes.

Priority Significado
THREAD_MODE_BACKGROUND_BEGIN
0x00010000
Comience el modo de procesamiento en segundo plano. El sistema reduce las prioridades de programación de recursos del subproceso para que pueda realizar un trabajo en segundo plano sin afectar significativamente a la actividad en primer plano.

Este valor solo se puede especificar si hThread es un identificador para el subproceso actual. Se produce un error en la función si el subproceso ya está en modo de procesamiento en segundo plano.

Windows Server 2003: Este valor no se admite.

THREAD_MODE_BACKGROUND_END
0x00020000
Modo de procesamiento en segundo plano final. El sistema restaura las prioridades de programación de recursos del subproceso tal como estaban antes de que el subproceso entrara en modo de procesamiento en segundo plano.

Este valor solo se puede especificar si hThread es un identificador para el subproceso actual. Se produce un error en la función si el subproceso no está en modo de procesamiento en segundo plano.

Windows Server 2003: Este valor no se admite.

THREAD_PRIORITY_ABOVE_NORMAL
1
Prioridad 1 punto por encima de la clase de prioridad.
THREAD_PRIORITY_BELOW_NORMAL
-1
Prioridad 1 punto por debajo de la clase de prioridad.
THREAD_PRIORITY_HIGHEST
2
Prioridad 2 puntos por encima de la clase de prioridad.
THREAD_PRIORITY_IDLE
-15
Prioridad base de 1 para los procesos de IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS o HIGH_PRIORITY_CLASS y una prioridad base de 16 para procesos de REALTIME_PRIORITY_CLASS .
THREAD_PRIORITY_LOWEST
-2
Prioridad 2 puntos por debajo de la clase de prioridad.
THREAD_PRIORITY_NORMAL
0
Prioridad normal para la clase priority.
THREAD_PRIORITY_TIME_CRITICAL
15
Prioridad base de 15 para los procesos de IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS o HIGH_PRIORITY_CLASS , y una prioridad base de 31 para procesos de REALTIME_PRIORITY_CLASS .
 

Si el subproceso tiene la clase base REALTIME_PRIORITY_CLASS , este parámetro también puede ser -7, -6, -5, -4, -3, 3, 4, 5 o 6. Para obtener más información, consulte Programación de prioridades.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si la función no se realiza correctamente, el valor devuelto es cero. Para obtener información de error extendida, llame a GetLastError.

Windows Phone 8.1: Windows Phone aplicaciones de la Tienda pueden llamar a esta función, pero no tiene ningún efecto. La función devolverá un valor distinto de cero que indica que se ha realizado correctamente.

Comentarios

Cada subproceso tiene un nivel de prioridad base determinado por el valor de prioridad del subproceso y la clase priority de su proceso. El sistema usa el nivel de prioridad base de todos los subprocesos ejecutables para determinar qué subproceso obtiene el siguiente segmento de tiempo de CPU. Los subprocesos se programan de forma round robin en cada nivel de prioridad y solo cuando no hay subprocesos ejecutables en un nivel superior, se realiza la programación de subprocesos en un nivel inferior.

La función SetThreadPriority permite establecer el nivel de prioridad base de un subproceso en relación con la clase de prioridad de su proceso. Por ejemplo, al especificar THREAD_PRIORITY_HIGHEST en una llamada a SetThreadPriority para un subproceso de un proceso de IDLE_PRIORITY_CLASS , se establece el nivel de prioridad base del subproceso en 6. Para obtener una tabla que muestre los niveles de prioridad base para cada combinación de la clase de prioridad y el valor de prioridad del subproceso, consulte Programación de prioridades.

Para los procesos de IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS y HIGH_PRIORITY_CLASS , el sistema aumenta dinámicamente el nivel de prioridad base de un subproceso cuando se producen eventos importantes para el subproceso. REALTIME_PRIORITY_CLASS procesos no reciben aumentos dinámicos.

Todos los subprocesos se inician inicialmente en THREAD_PRIORITY_NORMAL. Use las funciones GetPriorityClass y SetPriorityClass para obtener y establecer la clase de prioridad de un proceso. Use la función GetThreadPriority para obtener el valor de prioridad de un subproceso.

Use la clase de prioridad de un proceso para diferenciar entre las aplicaciones que son críticas para el tiempo y las que tienen requisitos de programación normales o inferiores. Use valores de prioridad de subproceso para diferenciar las prioridades relativas de las tareas de un proceso. Por ejemplo, un subproceso que controla la entrada de una ventana podría tener un nivel de prioridad más alto que un subproceso que realiza cálculos intensivos para la CPU.

Al manipular prioridades, tenga mucho cuidado para asegurarse de que un subproceso de prioridad alta no consume todo el tiempo de CPU disponible. Un subproceso con un nivel de prioridad base superior a 11 interfiere con el funcionamiento normal del sistema operativo. El uso de REALTIME_PRIORITY_CLASS puede hacer que las memorias caché de disco no se vacían, hacen que el mouse deje de responder, etc.

Los valores THREAD_PRIORITY_* afectan a la prioridad de programación de CPU del subproceso. En el caso de los subprocesos que realizan trabajos en segundo plano, como E/S de archivos, E/S de red o procesamiento de datos, no es suficiente ajustar la prioridad de programación de cpu; incluso un subproceso de prioridad de CPU inactiva puede interferir fácilmente con la capacidad de respuesta del sistema cuando usa el disco y la memoria. Los subprocesos que realizan trabajo en segundo plano deben usar los valores de THREAD_MODE_BACKGROUND_BEGIN y THREAD_MODE_BACKGROUND_END para ajustar sus prioridades de programación de recursos; Los subprocesos que interactúan con el usuario no deben usar THREAD_MODE_BACKGROUND_BEGIN.

Cuando un subproceso está en modo de procesamiento en segundo plano, debe minimizar el uso compartido de recursos como secciones críticas, montones y identificadores con otros subprocesos del proceso; de lo contrario, se pueden producir inversiones prioritarias. Si hay subprocesos que se ejecutan con prioridad alta, es posible que un subproceso en el modo de procesamiento en segundo plano no se programe rápidamente, pero nunca se volverá a morir de hambre.

Windows Server 2008 y Windows Vista: Mientras se inicia el sistema, la función SetThreadPriority devuelve un valor devuelto correcto, pero no cambia la prioridad del subproceso para las aplicaciones que se inician desde la carpeta De inicio del sistema o se enumeran en la HKEY_LOCAL_MACHINE clave\ del Registrosoftware Microsoft\Windows\CurrentVersion\Run deSOFTWARE\. Estas aplicaciones se ejecutan con prioridad reducida durante un breve tiempo (aproximadamente 60 segundos) para que el sistema responda mejor a las acciones del usuario durante el inicio.

Windows 8.1 y Windows Server 2012 R2: esta función es compatible con las aplicaciones de la Tienda Windows.

Windows Phone aplicaciones de la Tienda 8.1:Windows Phone pueden llamar a esta función, pero no tiene ningún efecto.

Ejemplos

En el ejemplo siguiente se muestra el uso del modo en segundo plano del subproceso.

#include <windows.h>
#include <tchar.h>

int main( void )
{
   DWORD dwError, dwThreadPri;

   if(!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN))
   {
      dwError = GetLastError();
      if( ERROR_THREAD_MODE_ALREADY_BACKGROUND == dwError)
         _tprintf(TEXT("Already in background mode\n"));
      else _tprintf(TEXT("Failed to enter background mode (%d)\n"), dwError);
      goto Cleanup;
   } 

   // Display thread priority

   dwThreadPri = GetThreadPriority(GetCurrentThread());

   _tprintf(TEXT("Current thread priority is 0x%x\n"), dwThreadPri);

   //
   // Perform background work
   //
   ;

   if(!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END))
   {
      _tprintf(TEXT("Failed to end background mode (%d)\n"), GetLastError());
   }

Cleanup:
   // Clean up
   ;
return 0;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado processthreadsapi.h (incluya Windows.h en Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib; WindowsPhoneCore.lib en Windows Phone 8.1
Archivo DLL Kernel32.dll; KernelBase.dll en Windows Phone 8.1

Consulte también

GetPriorityClass

GetThreadPriority

Funciones de proceso y subproceso

Prioridades de programación

SetPriorityClass

Subprocesos