Aufgaben anhand der Auslastung eines Prozesses

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

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

Aufgaben anhand der Auslastung eines Prozesses

20 Jun 2017, 06:18

GUI.jpg
GUI.jpg (271.78 KiB) Viewed 952 times

Code: Select all

#singleinstance force 

Gui, Add, ListView, x2 y0 w400 h500, Name|PID|CPU
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
    LV_Add("", process.Name, process.processId,"...")
Gui, Show,, Process List

SetTimer, UpdateCpuUsage
Return

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

; 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
GetProcessTimes(PID)    
{
    static aPIDs := []
    ; 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"] 

    DllCall("GetSystemTimes", "Int64*", lpIdleTimeSystem, "Int64*", lpKernelTimeSystem, "Int64*", lpUserTimeSystem)
    if !hProc := DllCall("OpenProcess", "UInt", 0x400, "Int", 0, "Ptr", pid)
        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)
    
    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, "lpUserTimeSystem"] := lpUserTimeSystem
    aPIDs[PID, "lpKernelTimeProcess"] := lpKernelTimeProcess
    aPIDs[PID, "lpUserTimeProcess"] := lpUserTimeProcess
    aPIDs[PID, "tickPrior"] := A_TickCount
    return aPIDs[PID, "usagePrior"] := result 
}
Dieser Code zeigt mir hervorragend für den Prozess: "terminal.exe" die CPU-Usage in %. Terminal.exe ist Metatrader 4.
Wie kann ich anhand der CPU-Usage von terminal.exe befehlen, dass wenn die CPU-Usage unter 5% liegt, z.B. mspaint öffnet?
Vielleicht kann man die Liste in eine Variable speichern und alles auseinander nehmen, sodass man nun die Prozentzahl von terminal.exe als Variable hat? Doch ich weiß nicht, wie man eine Gui-Liste in eine Variable speichert. Möchte mir jemand helfen?

Liebe Grüße
Fresh Janine
Last edited by jNizM on 20 Jun 2017, 07:31, edited 1 time in total.
Reason: added code tags
just me
Posts: 6792
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Aufgaben anhand der Auslastung eines Prozesses

20 Jun 2017, 06:30

:arrow: CPU Usage von einem Programm auslesen

Warum machst Du einen zweiten Beitrag auf?

P.S.: Ich interessiere mich nicht für 'Expert Advisors' und 'Metatrader'. Wenn man sich damit aber leidenschaftlich beschäftigt, sollte es doch ein Vergnügen sein, das händisch auszutesten.
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Aufgaben anhand der Auslastung eines Prozesses

20 Jun 2017, 06:45

Das Thema hier ist ähnlich, da es Fragen zu einem fertigen Skript sind, doch es ist nicht das selbe Thema.
Ich werde es auch händisch austesten bis es funktioniert, doch sowas dauert bei mir ungefähr immer 1 Monat. Ich dachte vielleicht gibt es hier Leute, die das mal eben so wissen. Und ich interessiere mich leidenschaftlich für Expert Advisors, aber nicht leidenschaftlich für Autohotkey, ergo ist es eigentlich nicht so ein Vergnügen für mich :(
just me
Posts: 6792
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Aufgaben anhand der Auslastung eines Prozesses

20 Jun 2017, 07:16

Wo schreib ich meine beispielsweise If-Klammer: "If (CPUUsage < 2)" hin, um zu befehlen, was danach passieren soll?
Wie kann ich anhand der CPU-Usage von terminal.exe befehlen, dass wenn die CPU-Usage unter 5% liegt, z.B. mspaint öffnet?
So wirklich erschließt sich mir der Unterschied nicht.

Ich gehe auch einfach mal davon aus, dass Du die 'Expert Advisors' nicht nur theoretisch nutzen willst. Wenn Dir das also Geld bringen soll, ist es wohl auch einige Mühe wert.
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Aufgaben anhand der Auslastung eines Prozesses

20 Jun 2017, 07:43

Du hast Recht. Was wirst du jetzt mit mir machen? Wir können uns da sicher irgendwie einigen :3
User avatar
divanebaba
Posts: 786
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Aufgaben anhand der Auslastung eines Prozesses

20 Jun 2017, 15:46

Fresh Janine wrote:Das Thema hier ist ähnlich, da es Fragen zu einem fertigen Skript sind, doch es ist nicht das selbe Thema.
Täglich dieselbe Suppe ist auslegungstechnisch auch niemals dieselbe Suppe. Selbst jeder Löffel unterscheidet sich vom vorherigen.
Erinnert mich an "Masters und Johnson", die tatsächlich geschrieben haben sollen, daß man es in einer Ehe, jeden Tag, niemals mit der selben Frau zu tun hätte. :HeHe: :HeHe:
Oder Konrad Lorenz: "Gänse sind auch nur Menschen." :trollface: :trollface:

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: GamerG1rl and 39 guests