Función SetPriorityClass (processthreadsapi.h)

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

Sintaxis

BOOL SetPriorityClass(
  [in] HANDLE hProcess,
  [in] DWORD  dwPriorityClass
);

Parámetros

[in] hProcess

Identificador del proceso.

El identificador debe tener el derecho de acceso PROCESS_SET_INFORMATION . Para obtener más información, consulte Derechos de acceso y seguridad de procesos.

[in] dwPriorityClass

Clase de prioridad para el proceso. Este parámetro puede ser uno de los valores siguientes.

Priority Significado
ABOVE_NORMAL_PRIORITY_CLASS
0x00008000
Proceso que tiene prioridad por encima de NORMAL_PRIORITY_CLASS pero por debajo de HIGH_PRIORITY_CLASS.
BELOW_NORMAL_PRIORITY_CLASS
0x00004000
Proceso que tiene prioridad por encima de IDLE_PRIORITY_CLASS pero por debajo de NORMAL_PRIORITY_CLASS.
HIGH_PRIORITY_CLASS
0x00000080
Proceso que realiza tareas críticas en el tiempo que se deben ejecutar inmediatamente. Los subprocesos del proceso tienen prioridad sobre los subprocesos de aquellos procesos de clase de prioridad normal o inactiva. Un ejemplo es la lista de tareas, que debe responder rápidamente cuando lo llama el usuario, independientemente de la carga en el sistema operativo. Use un cuidado extremo al usar la clase de alta prioridad, ya que una aplicación de clase de alta prioridad puede usar casi todo el tiempo de CPU disponible.
IDLE_PRIORITY_CLASS
0x00000040
Proceso cuyos subprocesos se ejecutan solo cuando el sistema está inactivo. Los subprocesos del proceso tienen menor prioridad que los subprocesos de cualquier proceso que se ejecute en una clase de prioridad más alta. Un ejemplo es un protector de pantalla. Los procesos secundarios heredan la clase de prioridad inactiva.
NORMAL_PRIORITY_CLASS
0x00000020
Proceso sin necesidad de programación especial.
PROCESS_MODE_BACKGROUND_BEGIN
0x00100000
Comience el modo de procesamiento en segundo plano. El sistema reduce las prioridades de programación de recursos del proceso (y sus subprocesos) 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 hProcess es un identificador del proceso actual. Se produce un error en la función si el proceso ya está en modo de procesamiento en segundo plano.

Windows Server 2003 y Windows XP: Este valor no se admite.

PROCESS_MODE_BACKGROUND_END
0x00200000
Modo de procesamiento en segundo plano final. El sistema restaura las prioridades de programación de recursos del proceso (y sus subprocesos) como estaban antes de que el proceso entrara en modo de procesamiento en segundo plano.

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

Windows Server 2003 y Windows XP: Este valor no se admite.

REALTIME_PRIORITY_CLASS
0x00000100
Proceso que tiene la prioridad más alta posible. Los subprocesos del proceso reemplazan a los subprocesos de todos los demás procesos, incluidos los procesos del sistema operativo que realizan tareas importantes. Por ejemplo, un proceso en tiempo real que se ejecuta durante más de un intervalo muy breve puede hacer que las memorias caché de disco no se vacíen o provoquen que el mouse no responda.

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.

Comentarios

Cada subproceso tiene un nivel de prioridad base determinado por el valor de prioridad del subproceso y la clase de prioridad 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. 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. Para obtener más información, consulte Programación de prioridades.

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

Si un proceso está en modo de procesamiento en segundo plano, los nuevos subprocesos que crea también estarán en modo de procesamiento en segundo plano. 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 alta prioridad, es posible que un subproceso en modo de procesamiento en segundo plano no se programe rápidamente, pero nunca se perderá.

Cada subproceso puede entrar en modo de procesamiento en segundo plano de forma independiente mediante SetThreadPriority. No llame a SetPriorityClass para entrar en el modo de procesamiento en segundo plano después de que un subproceso del proceso haya llamado a SetThreadPriority para entrar en modo de procesamiento en segundo plano. Una vez que un proceso finaliza el modo de procesamiento en segundo plano, restablece todos los subprocesos del proceso; sin embargo, no es posible que el proceso sepa qué subprocesos ya estaban en modo de procesamiento en segundo plano.

Ejemplos

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

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

int main( void )
{
   DWORD dwError, dwPriClass;

   if(!SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN))
   {
      dwError = GetLastError();
      if( ERROR_PROCESS_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 priority class

   dwPriClass = GetPriorityClass(GetCurrentProcess());

   _tprintf(TEXT("Current priority class is 0x%x\n"), dwPriClass);

   //
   // Perform background work
   //
   ;

   if(!SetPriorityClass(GetCurrentProcess(), PROCESS_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 (incluye Windows.h en Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

CreateProcess

CreateThread

GetPriorityClass

GetThreadPriority

Funciones de proceso y subproceso

Procesos

Prioridades de programación

SetThreadPriority