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

J'ai un fil d'arrière-plan qui fait un travail de type de fond I/O-intensive. Pour plaire aux autres threads et processus en cours d'exécution, je mets la priorité de fil en mode « fond » à l'aide SetThreadPriority, comme ceci:Déterminer si le thread courant est faible priorité d'E/S

SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); 

Cependant, THREAD_MODE_BACKGROUND_BEGIN est uniquement disponible dans Windows Server 2008 ou plus récent, ainsi que Windows Vista et plus récent, mais le programme doit également fonctionner sur Windows Server 2003 et XP. Ainsi, le code réel est plus comme ceci:

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

Le problème est que sur Windows XP, il va perturber totalement le système en utilisant trop d'E/S. J'ai un plan pour une manière laide et honteuse d'atténuer ce problème, mais cela dépend de moi pouvoir déterminer si le thread actuel a une faible priorité d'E/S ou non.

Maintenant, je sais que je peux stocker la priorité de thread que j'ai fini par définir, mais le flux de contrôle dans le programme n'est pas vraiment bien adapté pour cela. Je préférerais pouvoir tester plus tard si le thread actuel a une faible priorité d'E/S - s'il est en "mode d'arrière-plan".

tldr: 

GetThreadPriority ne semble pas me donner cette information, il ne donne que la priorité du processeur.

Y at-il un moyen de déterminer si le thread actuel a une faible priorité d'E/S?

+0

Comment GetThreadPriority fonctionne pas? – Goz

+0

@Goz: Cela donne seulement la priorité à la CPU. J'ai mis à jour la question pour inclure ceci. –

+0

Je vois ... intéressant. – Goz

Répondre

3

Eh bien, il échoue si vous l'avez déjà défini en mode d'arrière-plan. Pourriez-vous, en fonction de si vous souhaitez que ce soit en traitement en arrière-plan, non seulement Définir la priorité à l'arrière-plan commence et voir si elle échoue?

Si vous attendez/voulez que ce ne soit pas le cas, vous pouvez tester en appelant la fin de l'arrière-plan.

Si ce n'est pas bon pour vous, il vaudrait probablement mieux utiliser le stockage local de thread pour stocker s'il est en mode d'arrière-plan ou non.


Modifier par Magnus Hoff: Voilà comment je fini par la mettre en œuvre:

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 
    } 
} 

fonctionne bien :)

Questions connexes