#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=..\..\..\..\..\eigene_dateien\EIGENE_DATEIEN\Desktop\cpu_meter.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <StaticConstants.au3>
#include <windowsconstants.au3>
#include <array.au3>

#include <GUIConstants.au3>
#include <ProgressConstants.au3>

#include <_Adlib.au3>

; Bennden mit ESC
HotKeySet("{ESC}", "OnExit")

AutoItSetOption("TrayIconHide", 0)
AutoItSetOption("TrayMenuMode", 1)



;===============================================================================
; ================== CPU Informationen lesen
;===============================================================================

; CPU Auslastung
Global $CPUS = GetUsage()
; neue CPU Auslastung
Global $nCPUS = $CPUS
;_ArrayDisplay($nCPUS)

; Anazahl der Kerne, gesamt auslastung und 0 nicht mit zählen, CORE 1 = $array[1]
Global $CORES = UBound($CPUS) - 1
;MsgBox(0, 'Cores', $CORES)

; BARS + 1 weil 0 mitzählt
Global $BARS[$CORES+1]
Global $BARSLABEL[$CORES+1]
;_ArrayDisplay($BARS)

; Multithreading
Global $threads[$CORES+1]
Global $pids[$CORES+1]


;===============================================================================
; ================== GUI
;===============================================================================
$gui = GUICreate("CPU Meter", 300, 350 )


;===============================================================================
; ================== CPU Bars variabel erstellen
;===============================================================================
For $i = 0 To $CORES

	;$cpu = $i+1
	$height = 10
	$abstand= 40

	MsgBox(0, 'test', $i)



	$height = ($i-1) * $abstand + $height


	$BARSLABEL[$i] = GuiCtrlCreateLabel("", 25, $height, 200, 12)
	$BARS[$i] = GUICtrlCreateProgress (25, $height+15, 250, 15, $PBS_SMOOTH)

	GuiCtrlSetData(-1, $CPUS[$i])

	; Multithread betrieben für jede bar einen eigenene
	_AdlibEnable("refresh_core", 500 , -1, $i)




	;DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($BARS[$cpu]), "wstr", "", "wstr", "")
Next


;_ArrayDisplay($nCPUS)



; GUI Darstellen
GUISetState ()










While 1

	;==============================================================
	; GUI 1 Abfragen
	;==============================================================
	$msg = GUIGetMsg(1);
	Switch $msg[1]


		Case $gui
			;==============================================================
			; GUI 1 STANDARD
			;==============================================================
			Switch $msg[0]


				; Exit
				Case $GUI_EVENT_CLOSE
					OnExit()
			EndSwitch
	EndSwitch



	;==============================================================
	; CPU Daten aktualisieren
	;==============================================================

	;MsgBox(0, 'tet', 'dsd')
	GetUsage()
	;Sleep(50)
WEnd




OnExit()














;===============================================================================
; ================== Funktionen
;===============================================================================
Func OnExit()
    Global $objRefresher
	;$objRefresher.DeleteAll
	GUIDelete()
	Exit
EndFunc




;===============================================================================
; ================== Liest die CPU auslastung aus
;===============================================================================

func GetUsage()
	Global $nCPUS
	Local $aCPUS[1]

	$objRefresher = ObjCreate("WbemScripting.SWbemRefresher")
	$objWMIService = ObjGet("winmgmts:\\127.0.0.1\root\CIMV2")
	$objRefreshableItem = $objRefresher.AddEnum($objWMIService , "Win32_PerfFormattedData_PerfOS_Processor")

	   $objRefresher.Refresh
		If IsObj($objRefreshableItem) Then
			$i = 0
			For $objItem In $objRefreshableItem.ObjectSet
				;$aCPUS[$i] = $objItem.PercentProcessorTime
				_ArrayAdd($aCPUS, $objItem.PercentProcessorTime)
				$i += 1
			Next
		EndIf
	_ArrayDelete($aCPUS, 0)

	$nCPUS = $aCPUS
	return $aCPUS
EndFunc

;===============================================================================
; ================== Setzt die aktuelle Auslastung
;===============================================================================

Func refresh_core($core)
	Global $CPUS, $nCPUS, $BARS, $BARSLABEL

	$core = $core
	$i = $core-1

	;_ArrayDisplay($CPUS)
	;_ArrayDisplay($nCPUS)


	$old = $CPUS[$i]
	$new = $nCPUS[$i]
	$bar = $BARS[$i]
	$label = $BARSLABEL[$i]


	$CPUS[$i] = $nCPUS[$i] ; Alten Wert setzen

	;MsgBox(0, 'CORE', $core)

	;ConsoleWrite('CORE ' & $core &' # Auslastung( alt -> neu) #'& $old & " -> " & $new & @CR )
	GuiCtrlSetData($label, "CPU "& $i &" ( " & int($new) & " % )")


	While $old <> $new

		if $old > $new Then

			$old -= 1

		Else

			$old += 1

		EndIf

		;MsgBox(0, 'fdd', 'tes')

		GuiCtrlSetData($bar, $old)
		Sleep(10)

	WEnd


	;GuiCtrlSetData($bar, $new)
EndFunc








