Hallo ,
gibt es eine Möglichkeit die CPU auslastung auszulesen?
LG Pceumel
Hallo ,
gibt es eine Möglichkeit die CPU auslastung auszulesen?
LG Pceumel
ist schon etwas alt, k.a. woher ich die hab!?
cpuusage.au3:
Global $liOldIdleTime = 0
Global $liOldSystemTime = 0
; \/\/\/ Should do this \/\/\/ to initialize CPU time calculations, but not necessary. First call will, with a delay.
; CurrentCPU(1)
;For $n = 1 to 20
; $a = CurrentCPU()
; ToolTip(@error & @LF & $a)
; Sleep(500)
;Next
Func CurrentCPU($init = 0)
Local $SYS_BASIC_INFO = 0
Local $SYS_PERFORMANCE_INFO = 2
Local $SYS_TIME_INFO = 3
$SYSTEM_BASIC_INFORMATION = DllStructCreate("int;uint;uint;uint;uint;uint;uint;ptr;ptr;uint;byte;byte;short")
$status = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", "int", $SYS_BASIC_INFO, _
"ptr", DllStructGetPtr($SYSTEM_BASIC_INFORMATION), _
"int", DllStructGetSize($SYSTEM_BASIC_INFORMATION), _
"int", 0)
If $status[0] Then Return -1
While 1
$SYSTEM_PERFORMANCE_INFORMATION = DllStructCreate("int64;int[76]")
$SYSTEM_TIME_INFORMATION = DllStructCreate("int64;int64;int64;uint;int")
$status = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", "int", $SYS_TIME_INFO, _
"ptr", DllStructGetPtr($SYSTEM_TIME_INFORMATION), _
"int", DllStructGetSize($SYSTEM_TIME_INFORMATION), _
"int", 0)
If $status[0] Then Return -2
$status = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", "int", $SYS_PERFORMANCE_INFO, _
"ptr", DllStructGetPtr($SYSTEM_PERFORMANCE_INFORMATION), _
"int", DllStructGetSize($SYSTEM_PERFORMANCE_INFORMATION), _
"int", 0)
If $status[0] Then Return -3
If $init = 1 Or $liOldIdleTime = 0 Then
$liOldIdleTime = DLLStructGetData($SYSTEM_PERFORMANCE_INFORMATION,1)
$liOldSystemTime = DLLStructGetData($SYSTEM_TIME_INFORMATION,2)
Sleep(1000)
If $init = 1 Then Return -99
Else
$dbIdleTime = DLLStructGetData($SYSTEM_PERFORMANCE_INFORMATION,1) - $liOldIdleTime
$dbSystemTime = DLLStructGetData($SYSTEM_TIME_INFORMATION,2) - $liOldSystemTime
$liOldIdleTime = DLLStructGetData($SYSTEM_PERFORMANCE_INFORMATION,1)
$liOldSystemTime = DLLStructGetData($SYSTEM_TIME_INFORMATION,2)
$dbIdleTime = $dbIdleTime / $dbSystemTime
[/autoit] [autoit][/autoit] [autoit]$dbIdleTime = 100.0 - $dbIdleTime * 100.0 / DLLStructGetData($SYSTEM_BASIC_INFORMATION,11) + 0.5
Return $dbIdleTime
EndIf
$SYSTEM_PERFORMANCE_INFORMATION = 0
$SYSTEM_TIME_INFORMATION = 0
WEnd
EndFunc
beispiel:
#include "Cpuusage.au3"
[/autoit] [autoit][/autoit] [autoit]While 1
ToolTip(Round(CurrentCpu(),0) & "%")
Sleep(100)
WEnd
lgE
Hallo ich möchte gerne mit einem Authorensystem eine Videothek programmieren.
siehe Bild (Stark verkleinert)
[Blockierte Grafik: http://funkyimg.com/u2/112/221/authorenprogramm.jpg]
Eine nette idee ist, mit einem kleinen externen Computer, angeschlossen an einem Fernseher, das Programm laufen zu lassen.
Falls ich das ganze einem Freund gebe, möchte ich ausschließen, dass er versucht einen Film zu starten, obwohl der Computer noch am booten ist.
So wäre es sinnvoll ein Startbildschirm vom Videoprogramm zu starten ( Bild siehe unten ) und das solange anzeigen zu lassen, bis die Cpu Auslastung in einer bestimmten Zeit unter 5 % fällt ( Beispielswert)
Dann würde das Videoprogramm (HTPC) die Videofiles freigeben.
Diese Vorgehensweise finde ich sinnvoller als zu sagen, Du mußt 3 Minuten warten bis Du ein Film Starten kannst.
Ich habe irgendwo etwas von "DAU" gelesen. Ob es Abkürzung "DAU" heißt, weiß ich nicht mehr. Es soll für dümmster anzunehmender user stehen.
Fazit, ich möchte DAU ausschliessen [Blockierte Grafik: http://funkyimg.com/u2/457/030/funny3_1.jpg]
[Blockierte Grafik: http://funkyimg.com/u2/235/772/dau.jpg]
Zu dem Code oben hätte ich gerne gewußt, wie ich es umsetzen kann.
Ist
ToolTip(Round(CurrentCpu(),0) & "%")
[/autoit]
CurrentCpu schon die Variable?
kann ich das so in etwa schreiben..?
If $var.... > 0 Then
MsgBox(4096,"",
"Der Wert ist positiv")
ElseIf $var < 0 Then
MsgBox(4096,"",
"Der Wert ist negativ")
Da die Kommunikation mit dem Authorensystem nur über Textdatei und Ini-Datei läuft, würde es auch gehen, wenn die CPU Werte in eine INI Datei geschrieben werden und das Authorensystem ließt es regelmäßig aus und nachdem ein bestimmter Wert in einer bestimmten Zeit unterschritten wurde, kann das Authorensystem das Programm von Autoit schließen und die Arbeit fortführen.
über jede Hilfe bin ich dankbar..
gruß Slider
Hallo, schau mal HIER, dort sind die Funktionen exakt beschrieben.
ZitatIst CurrentCpu() schon die Variable?
Ja, die Rückgabe erfolgt in Prozent. In deinem Beispiel könntest du z.B. schreiben
[autoit]
Run("calc.exe")
WinWaitActive("Rechner")
WinActivate("Rechner")
Send("!a") ;ansicht
Sleep(200)
Send("w")
Sleep(100)
ControlSend("Rechner", "", "[CLASS:Edit; INSTANCE:1]", "964535464756") ;zahl ins editfeld
Sleep(100)
ControlClick("Rechner", "", "Button35") ;fakultät
Do ;solange wiederholen .....
[/autoit][autoit][/autoit][autoit]$t = TimerInit() ;timerstamp merken
Do ;solange wiederholen...
Sleep(100) ;bissl warten
ToolTip("Prozessorlast " & _GetCPUUsageOld() & " %") ;Last anzeigen
Until TimerDiff($t) > 4000 Or _GetCPUUsageOld() > 5 ;....bis die Zeit über 4 Sekunden oder die Last über 5% ist
Until _GetCPUUsageOld() < 5 ;....bis 4 Sekunden lang die CPU-Last unter 5% ist
[/autoit][autoit][/autoit][autoit]MsgBox(0, 0, "Die CPU-Auslastung war 4 Sekunden lang unter 5%")
[/autoit]
Der erste Teil des Scriptes startet den Windows Taschenrechner und berechnet die Fakultät einer großen Zahl (100% Prozessorlast).Währenddessen sollte in der Toolbox die Prozessorlast stehen. Nach einigen Sekunden fragt der Taschenrechner nach, ob er weitermachen soll oder anhalten. Dann auf Anhalten klicken. 4 Sekunden nachdem auf "Anhalten" geklickt wurde, erscheint die Messagebox.
Hallo Andy,
vielen dank für Deinen Script.................
Sorry, war gestern zu sehr gestresst, darum befasse ich mich erst Heute damit.
Edit:
Jetzt habe ich ein weiteres Problem, ich habe das Script etwas verkürzt
Do ;solange wiederholen .....
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Sleep(100) ;bissl warten
ToolTip("Prozessorlast " & CurrentCpu() & " %") ;Last anzeigen
Until CurrentCpu() < 5
[/autoit][autoit][/autoit][autoit]MsgBox(0, 0, "Die CPU-Auslastung war unter 5%")
[/autoit]wenn ich das Script starte, dauert es bis zu einer Minute, bis die CPU unter 5% steht
und bei einem erneuten Programmstart steht es nach einigen Sekunden unter 5% oder SOFORT und das Script wird beendet
aber unter Windows Taskmanager > CPU Auslastung und unter ToolTip steht 0% bis 0,5% - daher sollte das Programm doch sofort beendet werden
was ist falsch?
Edit:
Ich habe wohl die Lösung gefunden:
ich habe die ToolTip Anzeige weggelassen, die Prüfung wurde wohl davon gestört
[autoit]ToolTip("Prozessorlast " & CurrentCpu() & " %") ;Last anzeigen
[/autoit]Sorry, das ich den thread wieder zum leben erwecke, aber eis jmd ob das CPUUsage script auch untrer win7 läuft. bei mir wird immer -1 angezeigt.
Probiere es mal damit:
;coded by UEZ
#AutoIt3Wrapper_UseX64=n
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Opt("TrayIconHide", 1)
HotKeySet("{ESC}", "_Exit")
Global Const $Process_All_Access = 0x1F0FFF
Global $CreateTime = DllStructCreate("dword;dword")
Global $ExitTime = DllStructCreate("dword;dword")
Global $KernelTime = DllStructCreate("dword;dword")
Global $UserTime = DllStructCreate("dword;dword")
Global $FileTime = DllStructCreate("dword;dword")
Global $SystemTime = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort")
Global $IdleTime = DllStructCreate("dword;dword")
Global $sUserTime, $sKernelTime, $eUserTime, $eKernelTime
Global $ret, $hour, $minutes, $seconds, $milliseconds
Global $ProcHandle, $Process_CPU_Usage
Global $PID, $CPUTime, $mem, $prg
Global $logical_cpus = CPU()
Global $hProc
Global $GUI, $info
Global $hFile, $au3, $autoit3
Global $fname = "Dummy.exe"
Global $dummy_exe = @ScriptDir & "\" & $fname
Global $dummy_au3 = @ScriptDir & "\" & "Dummy.au3"
If Not FileExists($dummy_exe) Then
$hFile = FileOpen($dummy_au3, 2)
$au3 = "While 1" & @CRLF & "WEnd"
FileWrite($hFile, $au3)
FileClose($hFile)
If @OSArch = "x86" Then
$autoit3 = '"' & RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\aut2exe\aut2exe.exe" & '"'
Else
$autoit3 = '"' & RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AutoIt v3\AutoIt", "InstallDir") & "\aut2exe\aut2exe.exe" & '"'
EndIf
RunWait($autoit3 & ' /in "' & $dummy_au3 & '" /out "' & $dummy_exe & '" /nopack /comp 2')
EndIf
$PID = Run($dummy_exe)
[/autoit] [autoit][/autoit] [autoit]If $PID = 0 Then
MsgBox(16, "ERROR", "ERROR! Process " & $prg & " not found! Aborting..." & @CRLF)
Exit
EndIf
Global $iMemo, $hDebugGUI
$GUI = GUICreate("Process Information v0.40 Beta by UEZ - Press ESC to quit! Just do some calculations...", 740, 25, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_BORDER, $WS_CLIPSIBLINGS))
$iMemo = GUICtrlCreateEdit("", -1, -1, 820)
GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
GUICtrlSetBkColor($iMemo, 0xFFFFFF)
GUISetState()
$ProcHandle = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", $Process_All_Access, "int", False, "dword", $PID)
$ProcHandle = $ProcHandle[0]
While True
$CPUTime = _GetProcTime($ProcHandle)
$mem = _ProcessGetMem($ProcHandle) / 1024
$hour = Int($CPUTime / 10000000 / 3600)
$minutes = Int($CPUTime / 10000000 / 60)
If $minutes < 10 Then $minutes = "0" & $minutes
$seconds = Round((Int($CPUTime / 10000000) / 60 - Int($CPUTime / 10000000 / 60)) * 60, 0)
If $seconds < 10 Then $seconds = "0" & $seconds
$milliseconds = Round((Int($CPUTime / 10000) / 1000 - Int(Int($CPUTime / 10000) / 1000)) * 1000, 0)
If $milliseconds < 10 Then $milliseconds = "00" & $milliseconds
If $milliseconds > 9 And $milliseconds < 100 Then $milliseconds = "0" & $milliseconds
$info = @CR & $fname & " | PID: " & $PID & " | CPU time: " & $hour & ":" & $minutes & ":" & $seconds & "." & $milliseconds & " (h:m:s.ms) | Mem usage: " & $mem & " KB | CPU usage: " & $Process_CPU_Usage & " % " & @CR
MemoWrite($info)
Sleep(1000)
If Not ProcessExists($PID) Then _Exit()
WEnd
Func MemoWrite($sMessage = "")
GUICtrlSetData($iMemo, $sMessage)
EndFunc ;==>MemoWrite
Func _GetProcTime($ProcessHandle)
$ret = DllCall("kernel32.dll", "int", "GetProcessTimes", "int", $ProcessHandle, "ptr", DllStructGetPtr($CreateTime), "ptr", DllStructGetPtr($ExitTime), "ptr", DllStructGetPtr($KernelTime), "ptr", DllStructGetPtr($UserTime))
If $ret[0] = 0 Then
ConsoleWrite("(" & @ScriptLineNumber & ") : = Error in GetProcessTimes call" & @CRLF)
SetError(1, 0, $ret[0])
EndIf
$sKernelTime = DllStructGetData($KernelTime, 1)
$sUserTime = DllStructGetData($UserTime, 1)
$Process_CPU_Usage = Floor(($sKernelTime - $eKernelTime + $sUserTime - $eUserTime) / 100000 / $logical_cpus)
If $Process_CPU_Usage > 100 Then $Process_CPU_Usage = "100"
$eKernelTime = $sKernelTime
$eUserTime = $sUserTime
Return $sUserTime + $sKernelTime
EndFunc ;==>_GetProcTime
Func _ProcessGetMem($ProcessHandle) ;get physical memory of the process -> http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
Local $structPROCESS_MEMORY_COUNTERS, $structPROCESS_MEMORY_COUNTERS_EX, $nSize, $aRet
If @OSVersion <> "WIN_7" Then
$structPROCESS_MEMORY_COUNTERS = DllStructCreate("dword cb; dword PageFaultCount; dword_ptr PeakWorkingSetSize; dword_ptr WorkingSetSize; " & _
"dword_ptr QuotaPeakPagedPoolUsage; dword_ptr QuotaPagedPoolUsage; dword_ptr QuotaPeakNonPagedPoolUsage; " & _
"dword_ptr QuotaNonPagePoolUsage; dword_ptr PagefileUsage; dword_ptr PeakPagefileUsage") ;http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
$nSize = DllStructGetSize($structPROCESS_MEMORY_COUNTERS)
$aRet = DllCall("psapi.dll", "int", "GetProcessMemoryInfo", "hwnd", $ProcessHandle, "ptr", DllStructGetPtr($structPROCESS_MEMORY_COUNTERS), "dword", $nSize) ;call GetProcessMemoryInfo
If $aRet[0] = 0 Then
ConsoleWrite("(" & @ScriptLineNumber & ") : = Error in GetProcessMemoryInfo call" & @LF)
SetError(1, 0, $aRet[0])
EndIf
Return DllStructGetData($structPROCESS_MEMORY_COUNTERS, "WorkingSetSize")
Else
$structPROCESS_MEMORY_COUNTERS_EX = DllStructCreate("dword cb; dword PageFaultCount; dword_ptr PeakWorkingSetSize; dword_ptr WorkingSetSize; " & _
"dword_ptr QuotaPeakPagedPoolUsage; dword_ptr QuotaPagedPoolUsage; dword_ptr QuotaPeakNonPagedPoolUsage; " & _
"dword_ptr QuotaNonPagePoolUsage; dword_ptr PagefileUsage; dword_ptr PeakPagefileUsage; " & _
"dword_ptr PrivateUsage") ;http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
$nSize = DllStructGetSize($structPROCESS_MEMORY_COUNTERS_EX)
$aRet = DllCall("Kernel32.dll", "int", "K32GetProcessMemoryInfo", "hwnd", $ProcessHandle, "ptr", DllStructGetPtr($structPROCESS_MEMORY_COUNTERS_EX), "dword", $nSize) ;call GetProcessMemoryInfo
If $aRet[0] = 0 Then
ConsoleWrite("(" & @ScriptLineNumber & ") : = Error in GetProcessMemoryInfo call" & @LF)
SetError(1, 0, $aRet[0])
EndIf
;~ ConsoleWrite("WorkingSetSize: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "WorkingSetSize") / 1024, 0) & @CRLF & _
;~ "PrivateUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PrivateUsage") / 1024, 0) & @CRLF & @CRLF)
Return DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PrivateUsage")
EndIf
EndFunc ;==>_ProcessGetMem
Func CPU() ;get logical CPU(s)
Local $sLPSystemInfo = DllStructCreate( "ushort dwOemId;" & _
"short wProcessorArchitecture;" & _
"dword dwPageSize;" & _
"ptr lpMinimumApplicationAddress;" & _
"ptr lpMaximumApplicationAddress;" & _
"long_ptr dwActiveProcessorMask;" & _
"dword dwNumberOfProcessors;" & _
"dword dwProcessorType;" & _
"dword dwAllocationGranularity;" & _
"short wProcessorLevel;" & _
"short wProcessorRevision")
Local $aResult = DllCall("Kernel32.dll", "none", "GetSystemInfo", "ptr",DllStructGetPtr($sLPSystemInfo))
If @error Or Not IsArray($aResult) Then Return SetError(1, 0, 0)
Return DllStructGetData($sLPSystemInfo, "dwNumberOfProcessors")
EndFunc ;==>CPU
Func Remove_Last_Comma($str)
If StringRight($str, 2) = ", " Then $str = StringMid($str, 1, StringLen($str) - 2)
Return $str
EndFunc ;==>Remove_Last_Comma
Func _Exit()
DllCall("kernel32.dll", "int", "CloseHandle", "int", $ProcHandle)
DllCall("psapi.dll", "int", "CloseHandle", "hwnd", $ProcHandle)
ProcessClose($PID)
Exit
EndFunc ;==>_Exit
Es wird ein Dummy AU3 erstellt, kompiliert und gestartet und dessen CPU Auslastung gemessen.
Sollte auch auf Win7 x64 laufen.
Gruß,
UEZ
hi dein Prozess lastet immer nur einen Prozessor aus und zeigt dadurch immer nur 25% bei mir an.
Mit AutoIt ist es nicht möglich die CPU Last auf alle Kerne zu verteilen, d.h. es wird immer "nur" ein Core eingeheizt.
Gruß,
UEZ