Trở về
Tham gia nhóm m Autoit đ đưc hưng dn và gii đáp trc tiếp : http://fb.com/groups/autoitscript
Tin tức công nghệ  -  Thủ thuật lập trình

Sunday, November 24, 2013

Tạo biểu đồ đồ họa tài nguyên CPU (CPU Usage) thời gian thực với Autoit


Toàn màn hìnhIn bài viết


Các thư viện yêu cầu :

Thư viện SLG.au3 hỗ trợ tạo biểu đồ đường với GDI+




Thư viện _PDH_PerformanceCounters.au3 hỗ trợ lấy thông tin CPU Usage


Cuối cùng là thư viện kèm theo _WinAPI_GetSystemInfo.au3


Các bạn save các thư viện này với đúng tên và đặt chung folder với mã nguồn chính

Mã nguồn

#include "SLG.au3"
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <_PDH_PerformanceCounters.au3>

Opt('GuiOnEventMode', 1)
_PDH_Init()

Local $hPDHQuery,$aCPUCounters,$iTotalCPUs,$hSplash
Local $iCounterValue,$sSplashText,$sPCName="" ; $sPCName="\\AnotherPC"
$hPDHQuery=_PDH_GetNewQueryHandle()
$aCPUCounters=_PDH_GetCPUCounters($hPDHQuery,$sPCName)
$iTotalCPUs=@extended
; successful? Then enter loop
If @error=0 And IsArray($aCPUCounters) Then
 ; Create baseline & initial sleep between 1st collection and start of 'real' collection
 _PDH_CollectQueryData($hPDHQuery)
 Sleep(50)
 ; Start loop
EndIf

Const $cBlue = 0xFF00ACFF, $cGreen = 0xFF00FF00, $cPink = 0xFFF004DE, $cYellow = 0xFFFFFF00
Const $cGray = 0xFFADADAD, $cRed = 0xFFFF0000, $cPurple = 0xFF8000FF, $cOrange = 0xFFFF8000
$GUI = GUICreate("CPU LIVE GRAPH !", 450, 240, -1, -1, -1, $WS_EX_TOPMOST)
GUISetBkColor(0)
$Increments = 200
$Gleft=30
$Gtop=18
$Gwidth=400
$Gheight=200
DemiliterRow($Gleft,$Gtop,$Gwidth,$Gheight)
GUISetOnEvent(-3, '_Exit')
GUISetState()

$Graph1 = _SLG_CreateGraph($GUI, $Gleft, $Gtop, $Gwidth, $Gheight, 0, 100, $Increments,0xFFFF0000,-1,-1,True)
_SLG_SetGridLineColor($Graph1,0xFF5C5C5C)

While 1
  _PDH_CollectQueryData($hPDHQuery)

   ; True means do *not* call _PDH_CollectQueryData for each update.  Only once per Query handle is needed
   $iCounterValue=_PDH_UpdateCounter($hPDHQuery,$aCPUCounters[$iTotalCPUs-1][1],0,True)


    _SLG_SetLineValue($Graph1, $iCounterValue)
    _SLG_UpdateGraph($Graph1)
    Sleep(100)
WEnd
Func DemiliterRow($Gleft=30,$Gtop=18,$Gwidth=400,$Gheight=200)
 for $i=0 to 10
if $i=0 then
GUICtrlCreateLabel('  '&$i*10&'   -',$Gleft-25,$Gtop+($Gheight/10)*(10-$i)-8)
else
 if 0<$i and $i<10 then
GUICtrlCreateLabel(' '&$i*10&'  -',$Gleft-25,$Gtop+($Gheight/10)*(10-$i)-7)
else
GUICtrlCreateLabel($i*10&' -',$Gleft-25,$Gtop+($Gheight/10)*(10-$i)-7)
 endif
endif
GUICtrlSetColor(-1,0x00FF00)
Next
GUICtrlCreateGroup("", $Gleft-2, $Gtop-8,$Gwidth+5, $Gheight+10)
GUICtrlCreateGroup("", -99, -99, 1, 1)
EndFunc
Func _Exit()
 _PDH_FreeQueryHandle($hPDHQuery)
_PDH_UnInit()
    Exit
EndFunc


; ===================================================================================================================
; --------------------  WRAPPER FUNCTION --------------------
; ===================================================================================================================
Func _PDH_GetCPUCounters($hPDHQuery,$sPCName="")
 ; Strip first '\' from PC Name, if passed
 If $sPCName<>"" And StringLeft($sPCName,2)="\\" Then $sPCName=StringTrimLeft($sPCName,1)
 ; CPU Usage (per processor) (":238\6\(*)" or English: "\Processor(*)\% Processor Time")
 Local $aCPUsList=_PDH_GetCounterList(":238\6\(*)"&$sPCName)
 If @error Then Return SetError(@error,@extended,"")
 ; start at element 1 (element 0 countains count), -1 = to-end-of-array
 Local $aCPUCounters=_PDH_AddCountersByArray($hPDHQuery,$aCPUsList,1,-1)
 If @error Then Return SetError(@error,@extended,"")
 Return SetExtended($aCPUsList[0],$aCPUCounters)
EndFunc

; ===================================================================================================================
; -------------------- MAIN PROGRAM CODE --------------------
; ===================================================================================================================

Giao diện chương trình :


Chương trình này mình viết dưới khuôn khổ code mẫu minh họa nên giao diện không được đẹp, các bạn có thể nghiên cứu và tùy biến thêm cho đẹp ^^