René1709 Geschrieben 28. Juli 2009 Geschrieben 28. Juli 2009 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é Zitieren
JasonDelife Geschrieben 28. Juli 2009 Geschrieben 28. Juli 2009 Ich glaube du musst das ".exe" beim Prozessname weglassen. Also nur "vmplayer". Grüße, JasonDelife. Zitieren
Gateway_man Geschrieben 28. Juli 2009 Geschrieben 28. Juli 2009 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"); Zitieren
René1709 Geschrieben 28. Juli 2009 Autor Geschrieben 28. Juli 2009 Dank euch. Das Problem war wirklich das .exe Das es so einfach war hätte ich glaube ich nie erraten. Wie gesagt. Danke. Zitieren
JasonDelife Geschrieben 28. Juli 2009 Geschrieben 28. Juli 2009 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. Zitieren
Gateway_man Geschrieben 28. Juli 2009 Geschrieben 28. Juli 2009 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. Zitieren
JasonDelife Geschrieben 28. Juli 2009 Geschrieben 28. Juli 2009 (bearbeitet) In der MSDN wird auch kein ".exe" verwendet. Das hat bei mir auch noch nie funktioniert. http://msdn.microsoft.com/de-de/library/z3w4xdc9.aspx Grüße, JasonDelife. Bearbeitet 28. Juli 2009 von JasonDelife Flascher Link Zitieren
René1709 Geschrieben 28. Juli 2009 Autor Geschrieben 28. Juli 2009 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. 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é Zitieren
René1709 Geschrieben 28. Juli 2009 Autor Geschrieben 28. Juli 2009 wie findet ihr denn die Lösung? Zitieren
0815FIA Geschrieben 28. Juli 2009 Geschrieben 28. Juli 2009 Hier so löse ich das in vb.net habs versucht in C# umzuschreiben aber irgendwie beißt sichs noch Convert VB.NET to C# - A free code conversion tool - developer Fusion - ASP.NET, C# Programming, VB.NET, .NET Framework, Java and Visual Basic Tutorials Zitieren
Gateway_man Geschrieben 28. Juli 2009 Geschrieben 28. Juli 2009 (bearbeitet) Convert VB.NET to C# - A free code conversion tool - developer Fusion - ASP.NET, C# Programming, VB.NET, .NET Framework, Java and Visual Basic Tutorials 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 28. Juli 2009 von Gateway_man Zitieren
Guybrush Threepwood Geschrieben 29. Juli 2009 Geschrieben 29. Juli 2009 Vor allem der Part wo du die länge vergleichst (was mir eh schleierhaft ist, welche länge da gemeint ist, die Anzahl der gefunden Prozesse... Zitieren
René1709 Geschrieben 29. Juli 2009 Autor Geschrieben 29. Juli 2009 Morgen, habe mein Problem doch noch nicht ganz gelöst. Wie lasse ich den shutdown befehl als Admin ausführen? Das Proramm soll ja später auf nem Benutzerkonto laufen ohne adminrechte. Zitieren
Gateway_man Geschrieben 1. August 2009 Geschrieben 1. August 2009 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 Zitieren
Empfohlene Beiträge
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.