#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_x64=CPU Benchmark x64.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Res_Comment=CPU Benchmark Test
#AutoIt3Wrapper_Res_Description=CPU Benchmark Test
#AutoIt3Wrapper_Res_Fileversion=1.0.1.0
#AutoIt3Wrapper_Res_LegalCopyright=SCode
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <WinAPISys.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Dim $final
$Rechnung1 = 0
$Rechnung2 = 0
$SingleCoreErgebnis = ""
$SingleCoreErgebnisse = ""
$TempDir = @TempDir & "\SCode Benchmark"

;GUI
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("CPU_Benchmark_x64", 232, 232, 656, 360)
$Label1 = GUICtrlCreateLabel("Threads:", 64, 40, 46, 17)
$Combo1 = GUICtrlCreateCombo("1", 128, 40, 65, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$Label2 = GUICtrlCreateLabel("Zeit in Sekunden:", 32, 80, 88, 17)
$StartButton = GUICtrlCreateButton("Start", 80, 176, 75, 25)
$Combo2 = GUICtrlCreateCombo("10", 128, 72, 65, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$Label3 = GUICtrlCreateLabel("Status:", 72, 128, 37, 17)
$Label4 = GUICtrlCreateLabel("Standby", 120, 128, 200, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

;GUI Sekunden
GUICtrlSetData($Combo2, "30|60|120|300", "10")
$ThreadMax = _WinAPI_GetSystemInfo()
For $nr3 = 2 To $ThreadMax[5]
	GUICtrlSetData($Combo1, $nr3, $nr3)
Next

;GUI wait + Hauptschleife
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $StartButton
			InstallEngine()
			GUICtrlSetData($Label4,"Testet...")
			BenchmarkTest()
	EndSwitch
WEnd
Exit

;Installiert "engine_x64.exe" im TempDir, falls nicht vorhanden.
Func InstallEngine()
	If Not FileExists($TempDir & "\engine_x64.exe") Then
		GUICtrlSetData($Label4,"Installiert Engine")
		DirCreate($TempDir)
		FileInstall("engine_x64.exe",$TempDir & "\engine_x64.exe",1)
		Sleep(1000)
	EndIf
EndFunc

;Benchmark Funktion
Func BenchmarkTest()
	$SingleCoreErgebnisse = ""
	$Rechnung = 0
	$Rechnung1 = 0
	$Rechnung2 = 0
	$Rechnung1_1 = 0
	$Rechnung2_1 = 0
	$ThreadNrInput = GUICtrlRead($Combo1)
	$SekInput = GUICtrlRead($Combo2)
	$date = @MDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & " - " & @ComputerName & " - " & $ThreadNrInput & " Thread/s - " & $SekInput & " Sekunden"

	;Führt "$ThreadNrInput" x "engine_x64.exe" aus.
	For $nr = 1 To $ThreadNrInput
		ShellExecute($TempDir & "\engine_x64.exe",$nr & " " & $SekInput,@ScriptDir)
	Next

	;Wartet bis alle Prozesse geschlossen sind.
	While ProcessExists("engine_x64.exe")
		Sleep(500)
	WEnd

	;Rechnung
	For $nr2 = 1 To $ThreadNrInput
		$Rechnung = IniRead($TempDir & "\engine.ini","Ergebnis",$nr2,0)
		$Rechnung1_1 = $Rechnung1_1 + $Rechnung
		Trennzeichen(Round($Rechnung,0))
		$Rechnung_S = $final
		$SingleCoreErgebnis = "SingleCore " & $nr2 & ": " & $Rechnung_S & @CRLF
		$SingleCoreErgebnisse = $SingleCoreErgebnisse & $SingleCoreErgebnis
	Next

	;Formatierung für GUI
	$Rechnung2_1 = $Rechnung1_1 / $ThreadNrInput
	Trennzeichen(Round($Rechnung1_1,0))
	$Rechnung1 = $final
	Trennzeichen(Round($Rechnung2_1,0))
	$Rechnung2 = $final
	GUICtrlSetData($Label4,"Standby")

	;An GUI senden + Ergebnis in Datei schreiben.
	If $ThreadNrInput > 1 Then
		MsgBox("","Ergebnis","Berechnungen pro Sekunde:" & @CRLF & "MultiCore: " & $Rechnung1 & @CRLF & "SingleCore Ø: " & $Rechnung2 & @CRLF & @CRLF & $SingleCoreErgebnisse)
		FileWrite("Ergebnis.txt.",$date & @CRLF & "Berechnungen pro Sekunde:" & @CRLF & "MultiCore: " & $Rechnung1 & @CRLF & "SingleCore Ø: " & $Rechnung2 & @CRLF & @CRLF & $SingleCoreErgebnisse & @CRLF & "___________________________________" &  @CRLF)
	Else
		MsgBox("","Ergebnis","Berechnungen pro Sekunde:" & @CRLF & "SingleCore: " & $Rechnung2)
		FileWrite("Ergebnis.txt.",$date & @CRLF & "Berechnungen pro Sekunde:" & @CRLF & "SingleCore: " & $Rechnung2 &  @CRLF & "___________________________________" &  @CRLF)
	EndIf
EndFunc

;Formatierungsfunktion
Func Trennzeichen($var)
	$final = ""
	$t = 0
	$result = StringSplit($var, "")

	For $x = $result[0] to 1 Step -1
		$t = $t +1
		If $t = 4 Then
			$final = "." & $final
			$t = 1
		EndIf
		$final =  $result[$x] & $final
	Next
EndFunc