Cette solution mange vraiment le cpu et en plus ralenti considérablement l'appli, va falloir l'optimiser, mais serait super si déjà ça marche
#COINIT_MULTITHREAD = 0
#RPC_C_AUTHN_LEVEL_CONNECT = 2
#RPC_C_IMP_LEVEL_IDENTIFY = 2
#EOAC_NONE = 0
#RPC_C_AUTHN_WINNT = 10
#RPC_C_AUTHZ_NONE = 0
#RPC_C_AUTHN_LEVEL_CALL = 3
#RPC_C_IMP_LEVEL_IMPERSONATE = 3
#CLSCTX_INPROC_SERVER = 1
#wbemFlagReturnImmediately = 16
#wbemFlagForwardOnly = 32
#IFlags = #wbemFlagReturnImmediately + #wbemFlagForwardOnly
#WBEM_INFINITE = $FFFFFFFF
#WMISeparator = ","
Procedure.l ansi2bstr(ansi.s)
Size.l = MultiByteToWideChar_ ( #CP_ACP , 0, ansi, -1, 0, 0)
Global Dim unicode.w(Size)
MultiByteToWideChar_ ( #CP_ACP , 0, ansi, Len (ansi), unicode(), Size)
ProcedureReturn SysAllocString_ ( @unicode())
EndProcedure
Procedure bstr2string (bstr)
Shared WMIResult.s
WMIResult.s = ""
pos = bstr
While PeekW (pos)
WMIResult = WMIResult + Chr ( PeekW (pos))
pos = pos + 2
Wend
ProcedureReturn @WMIResult
EndProcedure
Global loc.IWbemLocator, svc.IWbemServices, pUnk.IUnknown, pRefresher.IWbemRefresher, pConfig.IWbemConfigureRefresher
Global pEnumerator.IEnumWbemClassObject, pclsObj.IWbemClassObject, k.l
Global Dim wmitxt$(1)
Procedure OpenWMI()
root.s = "root\cimv2"
WMICommand.s = "select * from Win32_Processor,LoadPercentage"
CoInitializeEx_ (0, #COINIT_MULTITHREAD )
hres = CoInitializeSecurity_ (0, -1, 0, 0, #RPC_C_AUTHN_LEVEL_CONNECT , #RPC_C_IMP_LEVEL_IDENTIFY , 0, #EOAC_NONE , 0)
If hres <> 0 : e$ = "unable to call CoInitializeSecurity" : Goto cleanup : EndIf
hres = CoCreateInstance_ (?CLSID_WbemLocator, 0, #CLSCTX_INPROC_SERVER , ?IID_IWbemLocator, @loc.IWbemLocator)
If hres <> 0 : e$ = "unable to call CoCreateInstance" : Goto cleanup : EndIf
hres = loc\ConnectServer(ansi2bstr(root), 0, 0, 0, 0, 0, 0, @svc.IWbemServices)
If hres <> 0 : e$ = "unable to call IWbemLocator::ConnectServer" : loc\Release() : Goto cleanup : EndIf
hres = svc\QueryInterface(?IID_IUnknown, @pUnk.IUnknown)
hres = CoSetProxyBlanket_ (svc, #RPC_C_AUTHN_WINNT , #RPC_C_AUTHZ_NONE , 0, #RPC_C_AUTHN_LEVEL_CALL , #RPC_C_IMP_LEVEL_IMPERSONATE , 0, #EOAC_NONE )
If hres <> 0 : e$ = "unable to call CoSetProxyBlanket" : svc\Release() : loc\Release() : Goto cleanup : EndIf
hres = CoSetProxyBlanket_ (pUnk, #RPC_C_AUTHN_WINNT , #RPC_C_AUTHZ_NONE , 0, #RPC_C_AUTHN_LEVEL_CALL , #RPC_C_IMP_LEVEL_IMPERSONATE , 0, #EOAC_NONE )
If hres <> 0 : e$ = "unable to call CoSetProxyBlanket" : svc\Release() : loc\Release() : pUnk\Release() : Goto cleanup : EndIf
pUnk\Release()
hres= CoCreateInstance_ (?CLSID_WbemRefresher,0, #CLSCTX_INPROC_SERVER ,?IID_IWbemRefresher,@pRefresher.IWbemRefresher)
If hres <> 0 : e$ = "unable to call CoCreateInstance" : svc\Release() : loc\Release() : Goto cleanup : EndIf
hres=pRefresher\QueryInterface(?IID_IWbemConfigureRefresher,@pConfig.IWbemConfigureRefresher)
If hres <> 0 : e$ = "unable to QueryInterface" : svc\Release() : loc\Release() : pRefresher\Release() : Goto cleanup : EndIf
pRefresher\refresh(0)
k = CountString (WMICommand, #WMISeparator )
Dim wmitxt$(k)
For i = 0 To k
wmitxt$(i) = StringField (WMICommand, i + 1, #WMISeparator )
Next
EndProcedure
Procedure RefreshWMI()
hres = svc\ExecQuery(ansi2bstr( "WQL" ), ansi2bstr(wmitxt$(0)), #IFlags , 0, @pEnumerator.IEnumWbemClassObject)
If hres <> 0 : e$ = "unable to call IWbemServices::ExecQuery" : svc\Release() : loc\Release() : pRefresher\Release() : Goto cleanup : EndIf
hres = pEnumerator\reset()
Repeat
hres = pEnumerator\ Next ( #WBEM_INFINITE , 1, @pclsObj.IWbemClassObject, @uReturn)
If hres = 0
For i = 1 To k
Mem = AllocateMemory (1000)
hres = pclsObj\get(ansi2bstr(wmitxt$(i)), 0, Mem, 0, 0)
Type = PeekW (Mem)
Select Type
Case 8
val$ = PeekS (bstr2string( PeekL (Mem + 8 )))
Case 3
val$ = Str ( PeekL (Mem + 8 ))
Default
val$ = ""
EndSelect
If uReturn <> 0 : If wmi$ : wmi$ = wmi$ + "|" + val$ : Else : wmi$ = val$ : EndIf : EndIf
FreeMemory (Mem)
Next
pclsObj\Release()
EndIf
Until uReturn = 0
n = CountString (wmi$, "|" )
If n > 0
Total = 0
For i=1 To n+1
val = Val ( StringField (wmi$, i, "|" ))
Total + val
SetGadgetItemText (1, i-1, Str (val), 1)
Next
SetGadgetItemText (1, n+1, Str (Total/(n+1)), 1)
EndIf
EndProcedure
Procedure CloseWMI()
svc\Release() : loc\Release() : pEnumerator\Release() : pRefresher\Release()
cleanup :
CoUninitialize_ ()
EndProcedure
Procedure.l cpu_count() ; Retourne le nombre de processeur
Protected SI.SYSTEM_INFO
GetSystemInfo_ (@SI)
ProcedureReturn SI\dwNumberOfProcessors
EndProcedure
OpenWMI()
Win = OpenWindow ( #PB_Any , 0, 0, 200, 140, "CPU Usage Multi-Processors" , #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget )
If IsWindow (Win) And CreateGadgetList ( WindowID (Win))
ListIconGadget (1, 10, 10, 180, 120, "CPU" , 75)
AddGadgetColumn (1, 1, "% Usage" , 60)
NumberOfProcessors = cpu_count()
For i=0 To NumberOfProcessors-1
AddGadgetItem (1, -1, "CPU " + Str (i))
Next
AddGadgetItem (1, NumberOfProcessors, "CPU TOTAL" )
SetTimer_ ( WindowID (Win), 1, 1000, @RefreshWMI())
Repeat
Select WaitWindowEvent ()
Case #PB_Event_Gadget
Select EventGadget ()
;Case
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
KillTimer_ ( WindowID (Win), 1)
CloseWMI()
EndIf
End
DataSection
CLSID_IEnumWbemClassObject :
; 1B1CAD8C-2DAB-11D2-B604-00104B703EFD
Data.l $1B1CAD8C
Data.w $2DAB, $11D2
Data.b $B6, $04, $00, $10, $4B, $70, $3E, $FD
IID_IEnumWbemClassObject :
; 7C857801-7381-11CF-884D-00AA004B2E24
Data.l $7C857801
Data.w $7381, $11CF
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24
CLSID_WbemLocator :
; 4590f811-1d3a-11d0-891f-00aa004b2e24
Data.l $4590F811
Data.w $1D3A, $11D0
Data.b $89, $1F, $00, $AA, $00, $4B, $2E, $24
IID_IWbemLocator :
; dc12a687-737f-11cf-884d-00aa004b2e24
Data.l $DC12A687
Data.w $737F, $11CF
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24
IID_IUnknown :
; 00000000-0000-0000-C000-000000000046
Data.l $00000000
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
IID_IWbemRefresher:
;49353c99-516b-11d1-aea6-00c04fb68820
Data.l $49353C99
Data.w $516B, $11D1
Data.b $AE, $A6, $00, $C0, $4F, $B6, $88, $20
CLSID_WbemRefresher:
;c71566f2-561E-11D1-AD87-00C04FD8FDFF
Data.l $C71566F2
Data.w $561E, $11D1
Data.b $AD,$87,$00,$C0,$4F,$D8,$FD,$FF
IID_IWbemConfigureRefresher:
;49353c92-516b-11d1-aea6-00c04fb68820
Data.l $49353C92
Data.w $516B, $11D1
Data.b $AE, $A6, $00, $C0, $4F, $B6, $88, $20
EndDataSection