2010-05-19 5 views
6
if (reader.is_lazy()) goto tldr; 

Tengo un subproceso de fondo que realiza un trabajo de tipo de fondo intensivo de E/S. Para complacer a los demás hilos y procesos en ejecución, me puse la prioridad de subprocesos a "modo de fondo" usando SetThreadPriority, así:Determine si el subproceso actual tiene prioridad de E/S baja

SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); 

Sin embargo, THREAD_MODE_BACKGROUND_BEGIN sólo está disponible en Windows Server 2008 o posterior, así como Windows Vista y más nuevo, pero el programa también debe funcionar bien en Windows Server 2003 y XP. Por lo que el código real es de la misma familia:

if (!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN)) { 
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); 
} 

El problema con esto es que en Windows XP se interrumpirá totalmente el sistema mediante el uso de demasiada E/S. Tengo un plan para una forma fea y vergonzosa de mitigar este problema, pero eso depende de que yo pueda determinar si el subproceso actual tiene baja prioridad de E/S o no.

Ahora, sé que puedo almacenar qué prioridad de hilo terminé configurando, pero el flujo de control en el programa no es muy adecuado para esto. Me gustaría poder probar más tarde si el subproceso actual tiene una prioridad de E/S baja, si está en "modo de fondo".

tldr: 

GetThreadPriority no parece que me diera esta información, sólo se da la prioridad de la CPU.

¿Hay alguna manera de determinar si el subproceso actual tiene baja prioridad de E/S?

+0

¿Cómo GetThreadPriority no funciona? – Goz

+0

@Goz: solo le da prioridad a la CPU. Actualicé la pregunta para incluir esto. –

+0

Veo ... interesante. – Goz

Respuesta

3

Bueno, falla si ya lo ha configurado en modo de fondo. ¿Podrías, dependiendo de si te gustaría que fuera el procesamiento en segundo plano, no solo establecer la prioridad para que comience el fondo y ver si falla?

Si usted espera/quiere que no lo sea, puede probar llamando al fondo.

Si eso no es bueno para ti, probablemente sea mejor que simplemente uses Thread Local Storage para almacenar si está en modo de fondo o no.


Editar por Magnus Hoff: Esta es la forma en que terminó su implementación:

bool has_low_io_priority() { 
    if (SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN)) { 
     // Seems we were able to enter background mode. That means we were 
     // not in background mode from before. 
     SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END); 
     return false; 
    } else { 
     DWORD err = GetLastError(); 
     if (err == ERROR_THREAD_MODE_ALREADY_BACKGROUND) return true; 
     else return false; //< Background mode is not available at all 
    } 
} 

funciona bien :)

Cuestiones relacionadas