Auslastung eines Processes ermitteln.



  • Hallo,
    es gibt doch bestimmt eine API Funktion mit der ich die Auslastung eines bestimmten Processes ermitteln kann.

    kann mir da bitte jemand weiter helfen?

    danke schonmal im voraus...


  • Mod



  • 👍
    da hab ich auch geschaut, aber warscheinlich den wald für lauter bäumen nicht gesehen...



  • also hab das beispiel jetzt mal ausprobiert.

    leider funktioniert es nicht soo wie ich es gebrauchen könnte.

    ich muss diese abfrage "Auslastung des Processes" in einem Thread abfragen.
    leider liefert da dieses Beispiel IMMER null zurück. wenn man die abfrage nicht in einem thread macht funktioniert es einwandfrei.

    weis jemand an was das liegen könnte?

    oder hat jemand eine Idee wie ich folgendes problem anderst umsetzen könnte?

    Ich bin gerade dabei mir ein Programm zu schreiben das mir andere programme still installiert. Die auslastung das Processes bräuchte ich dafür, um mit der fortsetzung der stillen installation solange zu waren, bis das programm (was still instaliert wird) vertig mit dem entpacken ist und auf eine Benutzereingabe wartet.

    Mit WaitForInputIdle klappt das leider auch nicht, da das Programm was still installiert wird, ja gerade in der startfase ist.


  • Mod

    Da hilft Dir die Prozessorauslastung doch auch nicht.
    Warum funktioniert WaitForInputIdle nicht. Das ist doch genau der Sinn dieser Funktion!



  • ka warum WaitForInputIdle nicht funzt. ich nehm mal an wegen

    msdn schrieb:

    The WaitForInputIdle function can be used at any time, not just during application startup

    ich starte den Process des zu Installierenden Programmes mit CreateProcess.
    schick das Programm das mir das Installationsprogramm startet ne halbe sec schlaften mit Sleep und will dann WaitForInputIdle starten.

    Ich hab versucht WaitForInputIdle mit dem Handle aus PROCESS_INFORMATION, was mir ja durch CreateProcess zurückgeliefert wirt, bzw. auch mit dem Handle das mir durch OpenProcess zurückgegeben wird zu belegen. WaitForInputIdle reagiert nicht, es fällt jedesmal sofort durch und fährt mit der Programmausführung fort.

    und mit der Prozessauslastung hätte ich mir halt ein eigenes WaitForInputIdle gebastelt. Wenn die Processauslastung des jeweiligen Processes (Installationsprogramm) über null ist hätte ich halt die Programmausführung in einer schleife gefangen und mit der fortführung der stillen Installation gewartet..


  • Mod

    1. Was sagt GetLastError? Was gibt WaitForInputIdle zurück?
    2. Was willst Du nun? Warten bis der Prozess den Du gestartet hst ganz fertig ist. Dann nimm doch einfach WaitForSingleObject!



  • DWORD dwError = ::WaitForInputIdle(m_ProcInfo.hProcess,INFINITE);
    
    if(dwError == 0xFFFFFFFF)
    MsgBox(GetLastError());
    
    MsgBox(dwError);
    

    WaitForInputIdle gibt mir NULL zurück. also laut msdn "The wait was satisfied successfully". aber direckt am anfang, wenn gerade mal 15% des Installationsprogrammes entpackt sind.

    nein ich will nicht warten bis der process (installationsprogramm) beendet ist, denn der fall wird nicht eintreten. Da mein Programm das die Installation steuert VIEL schneller ist als das Installationsprogramm selbst. das Installationsprogramm entpackt gerade seine dateien, die für die Installation benötigt werden, da ist mein Programm das die Installation steuern soll, schon am ende. Sprich alle befehle für Button drücken ("Weiter, Lizens akzeptieren, Insallationsort usw."), wurden schon durchlaufen, aber die Benutzeroberfläche des Installationsprogrammes ist dafür noch nicht vorhanden.

    und das versuche ich ja gerade zu sycronisieren. und einfach ein sleep(5000) will ich nicht einbauen, denn was ist, wenn aus irgend einem grund das entpacken der dateien 10 sec dauert und nicht wie üblich 3 sec.


  • Mod

    Wenn WaitForInputIdle NULL liefert läuft Dein Programm und es nimmt Nachrichten entgegen, d.h. es hat eine Messageloop die abgearbeitet wird.

    - Wenn Du mehr möchtest könnte Dein zweites Programm einen Mutex setzen oder ein Event mit Namen auf das Du gezielt warten kannst.
    - Oder Du kannst warten bis bestimmte Dateien erzeugt wurden oder was auch immer.
    - Wenn es sich um ein MSI Installer handelt köntest Du die MSI Datenbank überwachen...

    Die Prozessorlast ist das letzte was Dir irgendwas anzeigt...



  • Wenn WaitForInputIdle NULL liefert läuft Dein Programm und es nimmt Nachrichten entgegen, d.h. es hat eine Messageloop die abgearbeitet wird.

    das deckt sich jetzt nicht mit meinen beobachtungen. denn mein Programm was die Installation steuert, versendet ja an das Installationsprogramm eben diese Nachrichten (viel zu schnell). aber das Installationsprogramm bleibt IMMER beim ersten Begrüsungsbildschirm stehen. und selbst wenn ich manuell weiter klicke, sind keine durch mein programm vorgenommene änderungen angekommen.

    ich versteh jetzt nicht ganz was du meinst, mit mutex und event. (im prinzip schon) aber das setze ich doch in WaitForSingleObject ein. und es würde letzten endes nur weiter gehen, wenn der mutex / event beendet ist. was letzten endes ja nur der fall ist, wenn auch der Process(des Installationsprogrammes) beendet ist. was ich ja nicht will. oder verstehe ich dich da jetzt falsch.


  • Mod

    Jetzt verstehe ich Dich nicht mehr!

    Was meinst du damit:

    denn mein Programm was die Installation steuert, versendet ja an das Installationsprogramm eben diese Nachrichten (viel zu schnell). aber das Installationsprogramm bleibt IMMER beim ersten Begrüsungsbildschirm stehen.

    Dein Programnm würde dann weiterlaufen wen der Mutex gesetzt ist. Das kann ja sein, wann immer Du möchtest und hängt ja nicht unbedingt mit dem Ende des zweiten Prozesses zusammen...

    Veruch mal bitte etwas detailier zu beschreiben wie diese zwei Prozess zusammenhängen.

    Versendest Du etwa WM_KEYDOWN Nachrichten?
    Lass es bleiben! Es geht nicht....
    http://blog.m-ri.de/index.php/2007/12/27/die-unsitte-tastatureingaben-mit-wm_keydown-nachrichten-zu-simulieren/



  • ok also ganz von vorne.

    Mein Programm A sucht nach Setup.exe dateien in deren Ordner eine A_Setup.dll enthalten ist. und sortiert die in einer Liste. Die A_Setup.dll ist für die Stille Installation des jeweiligen Installationsprogrammes B.

    Über die Liste (Rechte maustaste/jetzt zu testzwecken) lade ich die A_Setup.dll in das Programm A und starte durch die A_Setup.dll die jeweilige Installations Anwendung B.
    In diesem speziellen fall (bei manch anderen Installationsprogrammen auch) müssen noch dateien für die installation entpackt werden. das dauert i.d.R. so 3 sec (je nachdem wie schwer mein rechner mit anderen aufgaben beschäftigt ist auch mal länger)
    in diesen 3 sec. ist aber das Programm A schon über den Createprocess der Anwendung B hinaus und fährt mit der stillen Installation fort. ("Button Weiter drücken, Lizens akzeptieren drücken, Insallationsort wählen usw.").

    Auch wenn wie du sagst die Nachrichtenschleife schon aktiv ist, werden anscheinend meine Nachrichten in diesem zeitraum (3sec) ignoriert. und das Programm B bleibt bei dem Begrüßungsbildschirm der Installation stehen.

    somit muss ich jetzt einen weg finden, wie ich mein Programm A den Zeitraum des entpackens von Programm B ausbremse damit die Nachrichten wieder ankommen.


  • Mod

    Wenn es eine Stille Installation ist, dann kann Dir das doch egal sein.
    Warum muss Programm A auf das gestartete Programm B warten?
    Was hat das mit Nachrichten zwischen A+B zu tun.

    Du hast immernoch nicht erklärt warum Du auf B warten musst, wenn die Installation sowieso
    1. still ist
    2. im Hintergrund läuft.
    3. ist mir nicht klar, wieso A weitergehen darf und einen neuen Dialog anzeigt, wenn B noch nicht fertig ist.

    Tut mir leid, aber ich verstehe Dein Problem immer noch nicht.


Anmelden zum Antworten