Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi zusammen,

hab vor ein paar tagen schon mal die frage für Scripte unter Linux gestellt.

Das hat sich allerdings mittlerweile erübrigt.

Möchte unter C# ein Programm schreiben das beim Systemstart gestartet wird und im hintergrund überwacht ob ein Prozess läuft oder nicht.

Also grob möchte ich ne while schleife haben die so lange ausgeführt wird bis der Porzess nicht mehr läuft.

Habe bis jetzt folgendes:


            string x;

            x = "vmplayer.exe";


            while(Process.GetProcessesByName(x).Length > 0)

            {

                System.Threading.Thread.Sleep(10000);

            }

            System.Diagnostics.Process.Start("shutdown", "-s -t 00");

Hoffe es ist ersichtlich das er solange er die Schleife durchläuft für 10 sek. aussetzt und dann erst neu prüft ob der Prozess läuft.

Wenn der Prozess beendet ist soll er Windows runterfahren.

Wo ist mein Fehler? Denke die While Bedingung ist falsch oder?

Oder bin ich komplett auf dem Holzweg?

Gruß René

Geschrieben

Hier so löse ich das in vb.net habs versucht in C# umzuschreiben aber irgendwie beißt sichs noch:



            System.Diagnostics.Process externprozess = new System.Diagnostics.Process();

            externprozess.StartInfo.WorkingDirectory = "Pfad" ;

            externprozess.StartInfo.FileName = "Filename";

            /* wahlweise externprozess.start() sofern er schon läuft wird dies nicht benötigt*/

            while  (externprozess.HasExited == false)

            {

            /* Anweisung */


            }

           //System.Diagnostics.Process.Start("shutdown", "-s -t 00");


Geschrieben

Nur zur Ergänzung:

Windows-Prozesse heißen immer so wie die Datei, aber ohne Endung. Und genau das erwartet GetProcessesByName() auch.

@Gateway_man:

while(externprozess.HasExited == false)
schreibt man besser als:
while(!externprozess.HasExited)

Grüße, JasonDelife.

Geschrieben
Nur zur Ergänzung:

Windows-Prozesse heißen immer so wie die Datei, aber ohne Endung. Und genau das erwartet GetProcessesByName() auch.

Suspekt. Ich lass in meinem Projekt (vb.net) auch öfters Prozesse duch Prozessnamen suchen und benutze immer Dateiname.exe.

Geschrieben

Hab nochmal alles geändert.

Hier mal meine Lösung zu meinem Programm. Klappt hervorragend.

Vielleicht hilfts ja irgendwann irgendjemandem der auch so wenig ahnung hat wie ich. :D


            string x;

            bool check = true;

            x = "vmplayer";


            System.Threading.Thread.Sleep(240000);


            while(check == true)

            {

                Process[] vmplayer = Process.GetProcessesByName(x);

                if (vmplayer.Length > 0)

                {

                    check = true;

                    System.Threading.Thread.Sleep(10000);

                }

                else

                {

                    System.Threading.Thread.Sleep(10000);

                    Process[] vmplayer2 = Process.GetProcessesByName(x);

                    if (vmplayer2.Length == 0)

                    {

                        check = false;

                    }

                }


            }

            System.Diagnostics.Process.Start("shutdown", "-s -t 00");


Nochmal kurz zur Erklärung:

Dieses Programm startet beim Systemstart und fängt nach 4 Minuten an den Prozess "vmplayer" zu überwachen.

Er prüft alle 10 sekunden ob dieser läuft.

Wenn der Prozess nicht mehr läuft prüft er nach 10 sek. nochmal.

Sollte der prozess immernoch nicht mehr laufen, wird der PC heruntergefahren.

Gibt wahrscheinlich schönere und bessere Lösungen aber ich will ja auch FiSi werden und nicht FiAe ;)

Gruß René

Geschrieben (bearbeitet)

Ist mir bereits bekannt und meines erachtens nicht immer ganz zuverlässig, trotzdem öfters mal hilfreich.

Zu deiner Lösung würd ich sagen das es ne Notlösung ist, aber keines falls sehr elegant. Vor allem der Part wo du die länge vergleichst (was mir eh schleierhaft ist, welche länge da gemeint ist, geschweige denn das dies Funktion ein Member der Prozessklasse ist).

Gibt ja wie ich oben schon erwähnt hatte, extra in der Prozessklasse ein Member welches hasexited heißt, das exakt dafür hergenommen wird.

Aber wenns dir taugt und es funktionert, dann passts ja.

ps:

Das mit der exe würde mich nicht wundern da, wenn man mal in den taskmanager reinschaut stehn die Prozesse auch mit .exe drin. Bsp.: explorer.exe

Mfg

Gateway

Bearbeitet von Gateway_man
Geschrieben

Geh in deinem Projektmappenexplorer mit rechtsklick auf dein Projekt und wähle die Eingeschaften aus.

Dann gehst auf die Kartei Anwendung. Da müsste jetzt neben dem button assemblyinformationen auf ein Button mit "Einstellungen für die Benutzerkontensteuerung" sein. Klick darauf und tausche folgende Zeile aus :

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

mit:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Mfg

Simon

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...