Sous l'environnement de NT ou de Windows 2000, il est possible, pour
l'utilisateur, depuis le Task Manager, de modifier la priorité
d'exécution de certaines tâches. (Processes Tab | cliquer avec le bouton
de droite sur le processus et choisir l'option Set Priority). Un
nouveau processus, tel qu'Access, utilise, par défaut, une priorité au
niveau Normal ce qui indique que ce processus n'a pas de besoins
spécifiques. Cependant, tel qu'affiché par le Task Manager, c'est possible
d'assigner, même temporairement, une priorité plus élevée à un processus de
sorte que ce dernier s'accaparera d'une part plus importante du temps
d'utilisation du CPU.
La fonction API de SetPriorityClass sous Windows NT et Windows
2000 nous permet d'effectuer ce changement par programmation. On peut ainsi
accroître la priorité accordée à Access pour accommoder une requête critique
ou encore, un bout de code qui doit absolument s'exécuter un petit peu plus
rapidement.
Avertissements:
|
Utiliser la HIGH_PRIORITY_CLASS avec soin
et discernement. Si un filet d'exécution occupe une priorité élevée pour
une période prolongée, les autres filets d'exécution reçoivent, en
proportion, moins de temps, si ce n'est pas de temps du tout. De même,
si plusieurs filets d'exécution se retrouvent en des niveaux de priorité
élevée, cette importance relative perd quelque peu de sa signification.
Les priorités élevées devraient être réservées aux systèmes dont
l'exécution et le temps de réponse est critique. Si votre application
requière une priorité élevée pour une de ses tâches et qu'une priorité
normale fait l'affaire pour la majeure partie de son existence,
utiliser SetPriorityClass pour temporairement lever la
priorité accordée à votre application et réduire cette priorité après
que la tâche critique est terminée. Il est important que l'exécution
prioritaire soit restreinte à un court laps de temps et seulement pour
une application critique. |
Vous ne devriez pratiquement jamais utiliser
REALTIME_PRIORITY_CLASS car c'est à ce niveau de priorité que
s'effectuent les saisies depuis la souris ou de par le clavier, de même
que la gestion des tampons et des disques. Ce niveau est approprié pour
les applications qui "parlent" au niveau matériel ou qui doivent
effectuer une tâche brève qui ne doit pas être interrompue une fois
commencée. |
|
Private Declare Function apiOpenProcess _
Lib "kernel32" Alias "OpenProcess" _
(ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) _
As Long
Private Declare Function apiSetPriorityClass _
Lib "kernel32" Alias "SetPriorityClass" _
(ByVal hProcess As Long, _
ByVal dwPriorityClass As Long) _
As Long
Private Declare Function apiGetPriorityClass _
Lib "kernel32" Alias "GetPriorityClass" _
(ByVal hProcess As Long) _
As Long
Private Declare Function apiGetWindowThreadProcessId _
Lib "user32" Alias "GetWindowThreadProcessId" _
(ByVal hWnd As Long, _
lpdwProcessId As Long) _
As Long
Private Declare Function apiCloseHandle _
Lib "kernel32" Alias "CloseHandle" _
(ByVal hObject As Long) _
As Long
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const PROCESS_SET_INFORMATION = &H200
Public Const BELOW_NORMAL_PRIORITY_CLASS = &H4000
Public Const ABOVE_NORMAL_PRIORITY_CLASS = &H8000
Public Const NORMAL_PRIORITY_CLASS = &H20
Public Const IDLE_PRIORITY_CLASS = &H40
Public Const HIGH_PRIORITY_CLASS = &H80
Public Const REALTIME_PRIORITY_CLASS = &H100
Function fChangeAccessPriority(lngPriority As Long) As Boolean
On Error GoTo ErrHandler
Dim lpProcessID As Long
Dim hProcess As Long
Dim lngRet As Long
Call apiGetWindowThreadProcessId(hWndAccessApp, lpProcessID)
hProcess = apiOpenProcess( _
PROCESS_QUERY_INFORMATION Or _
PROCESS_SET_INFORMATION, _
False, _
lpProcessID)
If Not hProcess = 0 Then
lngRet = apiGetPriorityClass(hProcess)
If Not lngRet = lngPriority Then
lngRet = apiSetPriorityClass(hProcess, lngPriority)
fChangeAccessPriority = Not (lngRet = 0)
Else
fChangeAccessPriority = True
End If
End If
Call apiCloseHandle(hProcess)
ExitHere:
Exit Function
ErrHandler:
fChangeAccessPriority = False
Resume ExitHere
End Function