CPU Usage von einem Programm auslesen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

CPU Usage von einem Programm auslesen

19 Jun 2017, 09:55

Hallo,

ich beschäftige mich leidenschaftlich mit Expert Advisors für Metatrader 4 und ich möchte noch viel mehr gute Expert Advisors finden, doch ich habe jetzt mehr als 10.000 Expert Advisors, die einen Backtest von mir benötigen und wenn ich die alle manuell backtesten würde, dann würde ich wahrscheinlich ein paar Jahre brauchen. Also automatisiere ich es mit AHK und möchte gerne wissen, woher AHK weiß, wann ein Backtest beendet ist und das Programm nicht mehr arbeitet.

Ich denke, der beste Weg ist es, wenn ich mit einer Loop-Schleife die CPU-Usage permanent dieses Prozesses (terminal.exe) auslese und wenn die CPU-Usage unter 2% fällt, dann soll 5 Sekunden noch gewartet werden, ein Screenshot vom Ergebnis gespeichert werden und der nächste Backtest eines Expert Advisors eingestellt und gestartet werden.

Das Einzige, wo ich Hilfe brauche, ist das mit dem permanenten Auslesen der CPU-Usage des Prozesses "terminal.exe" und wenn es unter 2% fällt, das was gemacht werden soll. Vielleicht hat der ein oder andere auch schon mal mit sowas zutun gehabt und kann mir helfen? :wave:

Liebe Grüße
Fresh Janine
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: CPU Usage von einem Programm auslesen

19 Jun 2017, 10:10

https://autohotkey.com/board/topic/1139 ... -usage-in/
Hab während eines laufenden youtube videos das CPU monitoring gegen chrome.exe gefahren. Funzt (muss allerdings unter admin laufen).

Good luck :)
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: CPU Usage von einem Programm auslesen

19 Jun 2017, 12:04

Also das ist das was ich brauche oder wie?:

UpdateCpuUsage:
Loop % LV_GetCount()
{
LV_GetText(pid, A_Index, 2)
cpuUsage := Round(GetProcessTimes(pid)) "%"
LV_Modify(A_Index, "Col3", cpuUsage)
}
Return

Weil ich brauch kein Gui oder sonstige Zusätze. Ich will einfach nur, dass wenn der Prozess(terminal.exe) weniger als 2% CPU-Usage hat, was für mich tut.
Und mit dieser oben genannten Loop komme ich nicht klar. Wo schreibe ich das "terminal.exe" hin und wo muss ich den Befehl, dass wenn es weniger als 2% CPU-Usage hat hinschreiben. Also sowas in der Art: If (CPUU < 2)
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: CPU Usage von einem Programm auslesen

19 Jun 2017, 13:28

Code: Select all


; Return values
; -1 on first run 
; -2 if process doesn't exist or you don't have access to it
; Process cpu usage as percent of total CPU

if(A_ScriptName = "getProcessTimes().ahk"){
    Process, Exist,% "terminal.exe"
    PID :=  ErrorLevel
    SetTimer, gPT, 800
    Return
    }

gPT:
    i++
    ToolTip % PID " | " i " | " msg  .=  getProcessTimes(PID) "`n"
    If (i = 46) {
      SetTimer, gPT, Off
      Sleep, 6000
      ToolTip
      ExitApp
      }
    Return
    
    
getProcessTimes(PID) {
    static aPIDs := [], hasSetDebug
    ; If called too frequently, will get mostly 0%, so it's better to just return the previous usage 
    if aPIDs.HasKey(PID) && A_TickCount - aPIDs[PID, "tickPrior"] < 250
        return aPIDs[PID, "usagePrior"] 
   	; Open a handle with PROCESS_QUERY_LIMITED_INFORMATION access
    if !hProc := DllCall("OpenProcess", "UInt", 0x1000, "Int", 0, "Ptr", pid, "Ptr")
        return -2, aPIDs.HasKey(PID) ? aPIDs.Remove(PID, "") : "" ; Process doesn't exist anymore or don't have access to it.
         
    DllCall("GetProcessTimes", "Ptr", hProc, "Int64*", lpCreationTime, "Int64*", lpExitTime, "Int64*", lpKernelTimeProcess, "Int64*", lpUserTimeProcess)
    DllCall("CloseHandle", "Ptr", hProc)
    DllCall("GetSystemTimes", "Int64*", lpIdleTimeSystem, "Int64*", lpKernelTimeSystem, "Int64*", lpUserTimeSystem)
   
    if aPIDs.HasKey(PID) ; check if previously run
    {
        ; find the total system run time delta between the two calls
        systemKernelDelta := lpKernelTimeSystem - aPIDs[PID, "lpKernelTimeSystem"] ;lpKernelTimeSystemOld
        systemUserDelta := lpUserTimeSystem - aPIDs[PID, "lpUserTimeSystem"] ; lpUserTimeSystemOld
        ; get the total process run time delta between the two calls 
        procKernalDelta := lpKernelTimeProcess - aPIDs[PID, "lpKernelTimeProcess"] ; lpKernelTimeProcessOld
        procUserDelta := lpUserTimeProcess - aPIDs[PID, "lpUserTimeProcess"] ;lpUserTimeProcessOld
        ; sum the kernal + user time
        totalSystem :=  systemKernelDelta + systemUserDelta
        totalProcess := procKernalDelta + procUserDelta
        ; The result is simply the process delta run time as a percent of system delta run time
        result := 100 * totalProcess / totalSystem
    }
    else result := -1

    aPIDs[PID, "lpKernelTimeSystem"] := lpKernelTimeSystem
    aPIDs[PID, "lpKernelTimeSystem"] := lpKernelTimeSystem
    aPIDs[PID, "lpUserTimeSystem"] := lpUserTimeSystem
    aPIDs[PID, "lpKernelTimeProcess"] := lpKernelTimeProcess
    aPIDs[PID, "lpUserTimeProcess"] := lpUserTimeProcess
    aPIDs[PID, "tickPrior"] := A_TickCount
    return aPIDs[PID, "usagePrior"] := result 
}
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: CPU Usage von einem Programm auslesen

19 Jun 2017, 14:17

Oh man, ich hab kein Asperger Syndrom und weiß nicht viel mit deinem Code anzufangen. Ist das jetzt der fertige Code? Wenn das der fertige Code ist. Wo schreib ich meine beispielsweise If-Klammer: "If (CPUUsage < 2)" hin, um zu befehlen, was danach passieren soll?

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 65 guests