Wenn ich das folgende Skript in SciTE ausführen lasse, dann funktioniert alles, aber wenn es kompiliert ist, kommt der Fehler:
in Zeile 703:Variable used without beeing declared
Kann mir da jemand helfen? Und wie kann ich die CPU-Auslastung des Skripts verringern?
Skript:
Spoiler anzeigen
#include <process.au3>
#include <GUIConstants.au3>
#include <WindowsCOnstants.au3>
#include <IE.au3>
HotKeySet("{ESC}","_exit")
Opt("WinTitleMatchMode", 4)
$taskbar_pos = WinGetPos("classname=Shell_TrayWnd")
$taskbar_pos = $taskbar_pos[3]
Opt("WinTitleMatchMode", 1)
Global $pid,$name,$startram,$Proggui
[/autoit] [autoit][/autoit] [autoit]$title = WinGetTitle("")
$pid = WinGetProcess($title)
$name = _ProcessGetName($pid)
If Not $pid Then Exit
$startram = _GetRam($pid)
$Proggui = GUICreate("", 296, 35, @DesktopWidth - 296, @DesktopHeight- (35 + $taskbar_pos), $WS_POPUP,$WS_EX_TOOLWINDOW)
WinSetOnTop($Proggui, "", 1)
GUISetBkColor(0x004F4F)
$proggie = GUICtrlCreateProgress(100, 5, 296-105, 15)
$lab = GUICtrlCreateLabel("100%", 5, 5, 80, 16)
GUICtrlSetColor(-1, 0x00FFFF)
$kllab = GUICtrlCreateLabel($name & ":" & $startram & "", 5, 20, 275, 17)
GUICtrlSetColor(-1, 0x00FFFF)
DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Proggui, "int", 500, "long", 0x00040008);slide-in from bottom
WinSetOnTop($Proggui, "", 1)
$Pr_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $pid)
DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $Pr_Handle[0])
DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $Pr_Handle[0])
AdlibRegister("_UpdateRam", 550)
[/autoit] [autoit][/autoit] [autoit];Main While, damit das Skript nicht beendet wird
While Sleep(10)
$CPU = _GetCPUUsage()
$CPU0 = $CPU[0]
If $CPU0 = 1 Then $Auslastung = $CPU[1]
If $CPU0 = 2 Then $Auslastung = ($CPU[1] + $CPU[2]) / 2
If $CPU0 = 3 Then $Auslastung = ($CPU[1] + $CPU[2] + $CPU[3]) / 3
If $CPU0 = 4 Then $Auslastung = ($CPU[1] + $CPU[2] + $CPU[3] + $CPU[4]) /
GUICtrlSetData($proggie, $Auslastung)
$title = WinGetTitle("")
$pid = WinGetProcess($title)
$name = _ProcessGetName($pid)
$autoit = _ProcessGetName(@AutoItPID)
ProcessSetPriority($autoit, 0)
If Not $pid Then
Exit
EndIf
$startram = _GetRam($pid)
$ram = _GetRam($pid)
$temp = _ProcessGetPriority($name)
If $ram >= 0 Then
ProcessSetPriority($name, 0)
EndIf
If $ram >= 10000 Then
ProcessSetPriority($name, 1)
EndIf
If $ram >= 100000 Then
ProcessSetPriority($name, 2)
EndIf
If $ram >= 1000000 Then
ProcessSetPriority($name, 5)
EndIf
GUICtrlSetData($lab, $temp&" Points | CPU:")
WEnd
;_exit, beendet das Skript mit einem fade out der GUI
Func _exit()
DllCall ( "user32.dll", "int", "AnimateWindow", "hwnd", $Proggui, "int", 500, "long", 0x00090000 );fade-out
Exit
EndFunc
;_UpdateRam, gut sich alle 750ms an wieviel Memoryauslastung der Prozess hat
Func _UpdateRam()
If Not ProcessExists($pid) Then
AdlibUnRegister()
For $i = 30 To 0 Step - 1
$set = $i
If StringLen($set) < 2 Then $set = "0" & $i
$set = StringLeft($set, 1) & "." & StringRight($set, 1)
GUICtrlSetData($kllab,$name&" was terminated! Exit in "&$set)
GUICtrlSetData($lab,$set)
Sleep(100)
Next
_exit()
EndIf
$ram = _GetRam($pid)
GUICtrlSetData($kllab, $name & ":" & $ram & "")
$prog = (100 * $ram) / $startram
Return 1
EndFunc ;==>_UpdateRam
;_GetRam($iProcPid), gibt die Memoryauslastung der angegebenden PID zurück
Func _GetRam($iProcPid)
Local $colItems = "",$Output = ""
$objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
$colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Process", "WQL", 0x30)
If IsObj($colItems) Then
For $objItem In $colItems
If $objItem.ProcessId = $iProcPid Then Return $objItem.WorkingSetSize / 1024
Next
Else
MsgBox(48, "WMI Output", "No WMI Objects Found for class: " & "Win32_Process")
Exit
EndIf
EndFunc ;==>_GetRam
Func _GetCPUUsage()
Local Const $SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = 8
Local Const $SYSTEM_TIME_INFO = 3
Local Const $tagS_SPPI = "int64 IdleTime;int64 KernelTime;int64 UserTime;int64 DpcTime;int64 InterruptTime;long InterruptCount"
Local $CpuNum, $IdleOldArr[1],$IdleNewArr[1], $tmpStruct
Local $timediff = 0, $starttime = 0
Local $S_SYSTEM_TIME_INFORMATION, $S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
Local $RetArr[1]
Local $S_SYSTEM_INFO = DllStructCreate("ushort dwOemId;short wProcessorArchitecture;dword dwPageSize;ptr lpMinimumApplicationAddress;" & _
"ptr lpMaximumApplicationAddress;long_ptr dwActiveProcessorMask;dword dwNumberOfProcessors;dword dwProcessorType;dword dwAllocationGranularity;" & _
"short wProcessorLevel;short wProcessorRevision")
;Anzahl der CPUs bestimmen
$err = DllCall("Kernel32.dll", "none", "GetSystemInfo", "ptr",DllStructGetPtr($S_SYSTEM_INFO))
If @error Or Not IsArray($err) Then ;Fehler beim 1. Dll Aufruf
Return $RetArr[0] = -1
Else
$CpuNum = DllStructGetData($S_SYSTEM_INFO, "dwNumberOfProcessors")
ReDim $RetArr[$CpuNum+1]
$RetArr[0] = $CpuNum
EndIf
$S_SYSTEM_INFO = 0
While 1
;Erstellen der Struktur für die Prozessor Performance
$S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = DllStructCreate($tagS_SPPI)
;Größe Struktur um später vielfache (MultiCore) der Structur lesen zu können
$StructSize = DllStructGetSize($S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
;Erstellen einer Pufferstruktur
$S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = DllStructCreate("byte puffer[" & $StructSize * $CpuNum & "]")
;Pointer zum wiederfinden
$pointer = DllStructGetPtr($S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
$err = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", _
"int", $SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, _
"ptr", DllStructGetPtr($S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION), _
"int", DllStructGetSize($S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION), _
"int", 0)
;Fehler beim 2. Dll Aufruf
If $err[0] Then
Return $RetArr[0] = -2
EndIf
;Struktur und Dll-Aufruf für Zeitmessung
Local $S_SYSTEM_TIME_INFORMATION = DllStructCreate("int64;int64;int64;uint;int")
$err = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", _
"int", $SYSTEM_TIME_INFO, _
"ptr", DllStructGetPtr($S_SYSTEM_TIME_INFORMATION), _
"int", DllStructGetSize($S_SYSTEM_TIME_INFORMATION), _
"int", 0)
;Fehler beim 3. Dll Aufruf
If $err[0] Then
Return $RetArr[0] = -3
EndIf
If $starttime = 0 Then ;Startwerte Ermitteln
ReDim $IdleOldArr[$CpuNum]
;Start-Informationen Auslesen
For $i = 0 to $CpuNum -1
$tmpStruct = DllStructCreate($tagS_SPPI, $Pointer + $i*$StructSize)
$IdleOldArr[$i] = DllStructGetData($tmpStruct,"IdleTime")
Next
;Startzeit ermitteln
$starttime = DllStructGetData($S_SYSTEM_TIME_INFORMATION, 2)
;Verzögerung um einen Zeitunterschied sicher zu stellen
Sleep(500)
Else
ReDim $IdleNewArr[$CpuNum]
;Neue Informationen auslesen
For $i = 0 to $CpuNum -1
$tmpStruct = DllStructCreate($tagS_SPPI, $Pointer + $i*$StructSize)
$IdleNewArr[$i] = DllStructGetData($tmpStruct,"IdleTime")
Next
;Zeitdifferenze in 100 nanosekunden
$timediff = DllStructGetData($S_SYSTEM_TIME_INFORMATION, 2) - $starttime
;Auslastung errechnen
For $i=0 to $CpuNum -1
$RetArr[$i+1] = Round(100-(($IdleNewArr[$i] - $IdleOldArr[$i]) * 100 / $timediff))
Next
Return $RetArr
EndIf
;Speicher wieder frei geben
$S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = 0
$S_SYSTEM_TIME_INFORMATION = 0
$tmpStruct = 0
WEnd
EndFunc