Salut,
Une nouvelle version de ce code qui permet de calculer le pourcentage d'utilisation du processeur.
Cette fois ci, il est basé sur un code de Doctorized sur le forum anglais
http://www.purebasic.fr/english/viewtop ... 13&t=46347
Donc j'ai à nouveau besoin de testeurs.
J'ai essayé sur mon PC (quadcore window 7) et pas de soucis.
Je cherche donc particulièrement des windows XP, des processeur double cœur ou simple cœur, et le processeur zarbi de Dobro


Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; (Basé sur un code de Jacobus pour la compréhension de L'API windows nécessaire au calcul)
; Version de PB : 4.60
; Explication du programme :
; Utilisation du processeur
Structure ProcessorInfo
Count.l ; Nombre de processeurs
PdhQuery.i
Array PdhCounter.i(1)
GlobalUsage.d
Array Usage.d(1)
EndStructure
Global Processor.ProcessorInfo
Procedure.d GetProcessorUsage()
Structure PDH_FMT_COUNTERVALUE
CStatus.l
padding.l
ulValueLow.l
ulValueHigh.l
EndStructure
Protected lpValue.PDH_FMT_COUNTERVALUE, dwType.l
If Processor\Count > 0
Processor\GlobalUsage = 0
PdhCollectQueryData_(Processor\PdhQuery)
For Index = 1 To Processor\Count
PdhGetFormattedCounterValue_(Processor\PdhCounter(Index), $200, @dwType.l, @lpValue)
CopyMemory(@lpValue\ulValueLow, @Processor\Usage(Index), SizeOf(Double))
Processor\GlobalUsage + Processor\Usage(Index)
Next
Processor\GlobalUsage / Processor\Count
EndIf
ProcedureReturn Processor\GlobalUsage
EndProcedure
Procedure CloseProcessorUsage()
If Processor\Count > 0
PdhCloseQuery_(Processor\PdhQuery)
Processor\PdhQuery = 0
EndIf
EndProcedure
Procedure InitProcessorUsage()
#COUNTERPERF_PROCESSOR = 238
#COUNTERPERF_PERCENTPROCESSORTIME = 6
#PDH_CSTATUS_VALID_DATA = 0
#PDH_CSTATUS_NEW_DATA = 1
Protected SystemInformation.SYSTEM_INFO
Protected LibrairiePdh.i, *MemoireTexte.i, LongueurTexte.i, ProcessorName.s
GetSystemInfo_ (@SystemInformation)
Processor\Count = SystemInformation\dwNumberOfProcessors
Redim Processor\PdhCounter(Processor\Count)
Redim Processor\Usage(Processor\Count)
If PdhOpenQuery_(0, 1, @Processor\PdhQuery) = 0
LibrairiePdh = OpenLibrary(#PB_Any, "pdh.dll")
If LibrairiePdh
*MemoireTexte = AllocateMemory(#MAX_PATH + 1)
If *MemoireTexte
For Index = 1 To Processor\Count
ProcessorName = ""
LongueurTexte = #MAX_PATH
CallFunction(LibrairiePdh, "PdhLookupPerfNameByIndexA", #Null, #COUNTERPERF_PROCESSOR, *MemoireTexte, @LongueurTexte)
ProcessorName + "\" + PeekS(*MemoireTexte, LongueurTexte) + "(" + Str(Index - 1) + ")"
LongueurTexte = #MAX_PATH
CallFunction(LibrairiePdh, "PdhLookupPerfNameByIndexA", #Null, #COUNTERPERF_PERCENTPROCESSORTIME, *MemoireTexte, @LongueurTexte)
ProcessorName + "\" + PeekS(*MemoireTexte, LongueurTexte)
Retour = PdhValidatePath_(ProcessorName)
If Retour = #ERROR_SUCCESS
Retour = PdhAddCounter_(Processor\PdhQuery, ProcessorName, 0, @Processor\PdhCounter(Index))
If Retour <> #PDH_CSTATUS_VALID_DATA
Processor\Count = 0
Break
EndIf
Else
Processor\Count = 0
Break
EndIf
Next
FreeMemory(*MemoireTexte)
Else
Processor\Count = 0
EndIf
CloseLibrary(LibrairiePdh)
Else
Processor\Count = 0
EndIf
If Processor\Count = 0
CloseProcessorUsage()
EndIf
Else
Processor\Count = 0
EndIf
GetProcessorUsage()
ProcedureReturn Processor\Count
EndProcedure
; Création de la fenêtre
If OpenWindow(0, 0, 0, 500, 400, "CPU", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
AddWindowTimer(0, 1, 1000)
InitProcessorUsage() ; Initialisation de la lecture de l'utilisation du/des processeurs
Largeur = WindowWidth(0)
Hauteur = WindowHeight(0)
Hauteur2 = Hauteur / (Processor\Count + 1)
CreateImage(0, Largeur, Hauteur, 32 | #PB_Image_Transparent)
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
For Index = 1 To Processor\Count + 1
Line(0, Hauteur2 * Index - 1, Largeur, 1, $C0BB3C90)
Next
StopDrawing()
CanvasGadget(0, 0, 0, Largeur, Hauteur)
LoadFont(0, "Arial", 9, #PB_Font_HighQuality)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Timer
Select EventTimer() ; Timers
Case 1
GetProcessorUsage() ; Lecture de l'utilisation du processeur
Temps - 1
#Largeur = 2
CopyImage(0, 1) ; Copie de l'image actelle du graphique
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0, 0, Largeur, Hauteur, $FFFFFFFF) ; Efface l'image
DrawAlphaImage(ImageID(1), -#Largeur, 0) ; Dessine l'ancien graphique décalé de 1 pixel
If Temps <= 0
Temps = 5
Line(Largeur - #Largeur, 0, 1, Hauteur2 * (Processor\Count + 1), $40BB3C90) ; Dessine l'axe vertical
EndIf
For Index = 1 To Processor\Count ; Dessine le pourcentage d'utilisation de chaque processeur dans le graphique
Line(Largeur - #Largeur, Hauteur2 * Index - 1, #Largeur, 1, $C0BB3C90) ; Dessine l'axe horizontal
Line(Largeur - #Largeur, Hauteur2 * (Index - 0.25) - 1, #Largeur, 1, $60BB3C90) ; Dessine l'axe horizontal 25%
Line(Largeur - #Largeur, Hauteur2 * (Index - 0.5) - 1, #Largeur, 1, $60BB3C90) ; Dessine l'axe horizontal 50 %
Line(Largeur - #Largeur, Hauteur2 * (Index - 0.75) - 1, #Largeur, 1, $60BB3C90) ; Dessine l'axe horizontal 75 %
Box(Largeur - #Largeur, Hauteur2 * Index - Hauteur2 * Processor\Usage(Index) / 100, #Largeur, Hauteur2 * Processor\Usage(Index) / 100, $90000000)
Next
; Dessine le pourcentage d'utilisation moyen (ou global) dans le graphique
Line(Largeur - #Largeur, Hauteur2 * (Processor\Count + 1) - 1, #Largeur, 1, $C0BB3C90) ; Dessine l'axe horizontal
Line(Largeur - #Largeur, Hauteur2 * (Processor\Count + 0.75) - 1, #Largeur, 1, $60BB3C90) ; Dessine l'axe horizontal 25%
Line(Largeur - #Largeur, Hauteur2 * (Processor\Count + 0.5) - 1, #Largeur, 1, $60BB3C90) ; Dessine l'axe horizontal 50%
Line(Largeur - #Largeur, Hauteur2 * (Processor\Count + 0.25) - 1, #Largeur, 1, $60BB3C90) ; Dessine l'axe horizontal 75%
Box(Largeur - #Largeur, Hauteur2 * (Processor\Count + 1) - Hauteur2 * Processor\GlobalUsage / 100, #Largeur, Hauteur2 * Processor\GlobalUsage / 100, $90000000)
StopDrawing()
StartDrawing(CanvasOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
DrawAlphaImage(ImageID(0), 0, 0)
DrawingFont(FontID(0))
For Index = 1 To Processor\Count ; Affichage du pourcentage d'utilisation de chaque processeur sous forme de texte
DrawText(4, 4 + Hauteur2 * (Index - 1), "Processeur " + Str(Index) + " : " + StrD(Processor\Usage(Index), 1) + "%", $FF000000)
Next
; Affichage du pourcentage d'utilisation processeur moyen (ou global) sous forme de texte
DrawText(4, 4 + Hauteur2 * Processor\Count, "Moyenne : " + StrD(Processor\GlobalUsage, 1) + "%", $FF000000)
StopDrawing()
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
CloseProcessorUsage()
[ Ancien code ]___________________________________________________
Salut,
Voici un code qui permet de calculer le pourcentage d'utilisation du processeur.
Il est basé sur un code de Jacobus issue du programme de ce sujet
http://www.purebasic.fr/french/viewtopic.php?f=8&t=9758
Par contre, j'y ai apporté une correction et mon calcul final n'a absolument rien à voir avec celui de Jacobus (Qui me semble être une grosse usine à gaz et qui à mon avis est faux). Alors Jacobus, si tu es dans le coin, essai mon code et dis moi ce que tu en penses.
Donc j'ai besoin de testeurs.
J'ai essayé sur mon PC (quadcore window 7) et pas de soucis.
Je cherche donc particulièrement des windows XP, des processeur double cœur ou simple cœur. Mais tout le monde est le bienvenue pour valider le bon fonctionnement

Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; (Basé sur un code de Jacobus pour la compréhension de L'API windows nécessaire au calcul)
; Version de PB : 4.60
; Explication du programme :
; Utilisation du processeur
Structure ProcessorInfoTime
Idle.q
Kernel.q
User.q
EndStructure
Structure ProcessorInfo
Count.l ; Nombre de processeurs
Array ActualTime.ProcessorInfoTime(1)
Array PreviousTime.ProcessorInfoTime(1)
GlobalUsage.d
Array Usage.d(1)
EndStructure
Global Processor.ProcessorInfo
Procedure.d GetProcessorUsage()
Structure SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
IdleTime.q
KernelTime.q
UserTime.q
Reserved1.q[2]
Reserved2.q
EndStructure
Protected Dim ProcessorPerformanceInformation.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION(Processor\Count - 1)
#SystemProcessorPerformanceInformation = 8
Protected Index.l, Librairie.i
Protected Time.ProcessorInfoTime, GlobalTime.q
If Processor\Count > 0
; Recopie des temps actuel dans les temps précédents
For Index = 1 To Processor\Count
CopyMemory(@Processor\ActualTime(Index), @Processor\PreviousTime(Index), SizeOf(ProcessorInfoTime))
Next
; Lecture des nouveaux temps processeurs
Librairie = OpenLibrary( #PB_Any , "ntdll.dll" )
If Librairie
If CallFunction(Librairie, "NtQuerySystemInformation" , #SystemProcessorPerformanceInformation , @ProcessorPerformanceInformation(), SizeOf(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * Processor\Count, 0) = 0
Processor\GlobalUsage = 0
For Index = 1 To Processor\Count
; Copie des temps processeurs
Processor\ActualTime(Index)\Idle = ProcessorPerformanceInformation(Index - 1)\IdleTime
Processor\ActualTime(Index)\Kernel = ProcessorPerformanceInformation(Index - 1)\KernelTime
Processor\ActualTime(Index)\User = ProcessorPerformanceInformation(Index - 1)\UserTime
; Différence entre avant après
Time\Idle = Processor\ActualTime(Index)\Idle - Processor\PreviousTime(Index)\Idle
Time\Kernel = Processor\ActualTime(Index)\Kernel - Processor\PreviousTime(Index)\Kernel
Time\User = Processor\ActualTime(Index)\User - Processor\PreviousTime(Index)\User
; Pourcentage d'utilisation
; Processor\Usage(Index) = Processor\Frequency * (Time\Kernel + Time\User + Time\Idle) / (GlobalTime * Processor\Count) / 100000
Processor\Usage(Index) = (1 - Time\Idle / (Time\Kernel + Time\User))
Processor\GlobalUsage + Processor\Usage(Index)
Next
Processor\GlobalUsage / Processor\Count
EndIf
CloseLibrary(Librairie)
EndIf
EndIf
ProcedureReturn Processor\GlobalUsage
EndProcedure
Procedure ProcessorUsageInit()
Protected SystemInformation.SYSTEM_INFO
GetSystemInfo_ (@SystemInformation)
Processor\Count = SystemInformation\dwNumberOfProcessors
Redim Processor\ActualTime(Processor\Count)
Redim Processor\PreviousTime(Processor\Count)
Redim Processor\Usage(Processor\Count)
GetProcessorUsage()
ProcedureReturn Processor\Count
EndProcedure
; Création de la fenêtre
If OpenWindow(0, 0, 0, 500, 400, "CPU", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
AddWindowTimer(0, 1, 1000)
ProcessorUsageInit() ; Initialisation de la lecture de l'utilisation du/des processeurs
Largeur = WindowWidth(0)
Hauteur = WindowHeight(0)
Hauteur2 = Hauteur / (Processor\Count + 1)
CreateImage(0, Largeur, Hauteur, 32 | #PB_Image_Transparent)
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
For Index = 1 To Processor\Count + 1
Line(0, Hauteur2 * Index - 1, Largeur, 1, $80BB3C90)
Next
StopDrawing()
CanvasGadget(0, 0, 0, Largeur, Hauteur)
LoadFont(0, "Arial", 9, #PB_Font_HighQuality)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Timer
Select EventTimer() ; Timers
Case 1
GetProcessorUsage() ; Lecture de l'utilisation du processeur
CopyImage(0, 1) ; Copie de l'image actelle du graphique
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0, 0, Largeur, Hauteur, $FFFFFFFF) ; Efface l'image
DrawAlphaImage(ImageID(1), -1, 0) ; Dessine l'ancien graphique décalé de 1 pixel
For Index = 1 To Processor\Count ; Dessine le pourcentage d'utilisation de chaque processeur dans le graphique
Line(Largeur - 1, Hauteur2 * Index - Hauteur2 * Processor\Usage(Index), 1, Hauteur2 * Processor\Usage(Index), $90000000)
Plot(Largeur - 1, Hauteur2 * Index - 1, $80BB3C90) ; Dessine l'axe horizontal
Next
; Dessine le pourcentage d'utilisation moyen (ou global) dans le graphique
Line(Largeur - 1, Hauteur2 * (Processor\Count + 1) - Hauteur2 * Processor\GlobalUsage, 1, Hauteur2 * Processor\GlobalUsage, $90000000)
Plot(Largeur - 1, Hauteur2 * (Processor\Count + 1) - 1, $80BB3C90) ; Dessine l'axe horizontal
StopDrawing()
StartDrawing(CanvasOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
DrawAlphaImage(ImageID(0), 0, 0)
DrawingFont(FontID(0))
For Index = 1 To Processor\Count ; Affichage du pourcentage d'utilisation de chaque processeur sous forme de texte
DrawText(4, 4 + Hauteur2 * (Index - 1), "Processeur " + Str(Index) + " : " + Str(100 * Processor\Usage(Index)) + "%", $FF000000)
Next
; Affichage du pourcentage d'utilisation processeur moyen (ou global) sous forme de texte
DrawText(4, 4 + Hauteur2 * Processor\Count, "Moyenne : " + Str(100 * Processor\GlobalUsage) + "%", $FF000000)
StopDrawing()
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow