Externes Programm innerhalb der Konsole starten

Eigener Bereich für die Entwickler unter uns! Add-Ins, aber auch andere Programme.
Antworten
jensw
Foren-Einsteiger
Beiträge: 22
Registriert: 12. Mai 2009, 20:23

Externes Programm innerhalb der Konsole starten

Beitrag von jensw »

Hallo zusammen,

ich versuche gerade ein kleines Add-In zu programmieren (in C#), habe nun aber das Problem,
dass ich auf Betätigung eines Buttons ein externes Programm starten müsste.

Mit folgendem Code geht das leider nicht:

Code: Alles auswählen

using System.Diagnostics;

namespace Microsoft.HomeServer.HomeServerConsoleTab.DigicorderManager
{
    public partial class MainTabUserControl : UserControl
    {
        IConsoleServices consoleServices;
        Process mediaProc;
...
        private void btLaunchApp_Click(object sender, EventArgs e)
        {
            mediaProc=Process.Start("C:\\Program...");
        }
...
    }
...
}
Kann mir jemand sagen was ich da falsch mache?

Danke und viele Grüße
Jens
AndreasM
Foren-Mitglied
Beiträge: 89
Registriert: 2. Jan 2008, 23:13

Re: Externes Programm innerhalb der Konsole starten

Beitrag von AndreasM »

Was heisst denn "geht nicht"? Kannst Du mal beschreiben was nicht geht und welche Fehlermeldung/Exception Du bekommst?

Andreas M.
jensw
Foren-Einsteiger
Beiträge: 22
Registriert: 12. Mai 2009, 20:23

Re: Externes Programm innerhalb der Konsole starten

Beitrag von jensw »

Gar keine Exception. Ich seh den Prozess des aufgerufenen Programms kurz im Taskmanager, das GUI der Anwendung
(Technisat Mediaport) erscheint aber nicht und der Prozess ist auch sofort wieder weg.

Danke und Gruß,
Jens
BMelchert
Foren-Mitglied
Beiträge: 105
Registriert: 29. Jun 2009, 19:38

Re: Externes Programm innerhalb der Konsole starten

Beitrag von BMelchert »

Hallo,

hast du mal:
jensw hat geschrieben:

Code: Alles auswählen

[...]
mediaProc.WaitForExit();   
[...]
versucht? Du kannst auch den ExitCode des Prozesses auswerten.

cu,
Bernd
WHS: Acer H340 (6 TB)
jensw
Foren-Einsteiger
Beiträge: 22
Registriert: 12. Mai 2009, 20:23

Re: Externes Programm innerhalb der Konsole starten

Beitrag von jensw »

Hallo,

also damit scheint's zu gehen:

Code: Alles auswählen

            mediaProc = new Process();
            ProcessStartInfo stInfo = new ProcessStartInfo();
            stInfo.WorkingDirectory = "C:\\Programme\\Mediaport\\";
            stInfo.FileName = "C:\\Programme\\Mediaport\\Mediaport.exe";  
            mediaProc.StartInfo = stInfo;
            mediaProc.Start();  
            mediaProc.WaitForExit();
            this.lbExitCode.Text = " RC: "+mediaProc.ExitCode.ToString();
Jetzt muss ich nur noch rausbekommen wie ich's schaffe das die Home-Server-Konsole nicht einfriert während MediaPort läuft. Jemand ne Idee?

Danke und Gruß,
Jens
BMelchert
Foren-Mitglied
Beiträge: 105
Registriert: 29. Jun 2009, 19:38

Re: Externes Programm innerhalb der Konsole starten

Beitrag von BMelchert »

Hallo,

die Konsole friert deshalb ein, weil du ja auf den Prozess wartest.

Evtl. hilft sowas:
jensw hat geschrieben:

Code: Alles auswählen

            mediaProc = new Process();
            ProcessStartInfo stInfo = new ProcessStartInfo();
            stInfo.WorkingDirectory = "C:\\Programme\\Mediaport\\";
            stInfo.FileName = "C:\\Programme\\Mediaport\\Mediaport.exe";  
            mediaProc.StartInfo = stInfo;
            mediaProc.Start();  
            
            while (!mediaProc.HasExited)
            {  
               System.Windows.Forms.Application.DoEvents();  
            } 
            //mediaProc.WaitForExit();
            this.lbExitCode.Text = " RC: "+mediaProc.ExitCode.ToString();
Am besten wäre aber: Solche Aktionen in einen separaten Thread, z.b. BackgroundWorker, auszulagern.

cu,
Bernd
WHS: Acer H340 (6 TB)
jensw
Foren-Einsteiger
Beiträge: 22
Registriert: 12. Mai 2009, 20:23

Re: Externes Programm innerhalb der Konsole starten

Beitrag von jensw »

Hallo,

das mit dem Thread hab ich eben probiert:

Code: Alles auswählen

    
class MediaPortStarter
    {
        public void DoWork()
        {
            Process mediaProc;
            mediaProc = new Process();
            ProcessStartInfo stInfo = new ProcessStartInfo();
            stInfo.WorkingDirectory = "C:\\Programme\\Mediaport\\";
            stInfo.FileName = "C:\\Programme\\Mediaport\\Mediaport.exe";
            mediaProc.StartInfo = stInfo;
            mediaProc.Start();
            mediaProc.WaitForExit();
        }
    }
}
Thread gestartet mit:

Code: Alles auswählen

workerObject = new MediaPortStarter();
            workerThread = new Thread(workerObject.DoWork);
            while (!workerThread.IsAlive) ;
da passiert garnix (nicht mal der Prozess erscheint im Taskmanager)

mit

Code: Alles auswählen

while (!mediaProc.HasExited)
            { 
               System.Windows.Forms.Application.DoEvents(); 
            } 
funktioniert's aber. Die Thread-Lösung wäre natürlich besser.

Gruß,
Jens
Benutzeravatar
AliG
Moderator
Beiträge: 3727
Registriert: 6. Jun 2007, 17:33
Wohnort: Salzburg, Österreich

Re: Externes Programm innerhalb der Konsole starten

Beitrag von AliG »

Hi!

Da passiert deswegen nichts, weil du den Thread erst starten musst:

Code: Alles auswählen

workerThread.Start();
lg Alex
Mache ich etwas richtig, merkt es keiner. Mache ich etwas falsch, vergisst es keiner. :D

Mein WHS
jensw
Foren-Einsteiger
Beiträge: 22
Registriert: 12. Mai 2009, 20:23

Re: Externes Programm innerhalb der Konsole starten

Beitrag von jensw »

Hallo,

ups, stimmt da fehlte was.
Muss ich nachher gleich mal probieren :-) Danke!


Grüße
Jens
jensw
Foren-Einsteiger
Beiträge: 22
Registriert: 12. Mai 2009, 20:23

Re: Externes Programm innerhalb der Konsole starten

Beitrag von jensw »

Code: Alles auswählen

while (!mediaProc.HasExited)
            { 
               System.Windows.Forms.Application.DoEvents(); 
            } 
funktioniert's aber. Die Thread-Lösung wäre natürlich besser.
funktioniert zwar, d.h. das aufgerufene Programm startet und die Konsole lässt sich trotzdem bedienen, aber dafür verwendet der HomeServerConsole.exe-Prozess dabei beinahe 100% der CPU-Leistung.
Die Thread-Lösung funktioniert nach der Korrektur (workerThread.Start();) jetzt auch, Mediaport startet, dafür schmiert die HomeServerConsole selbst ab --> wenn man remote an der HomeServer-Konsole angemeldet ist startet Mediaport und im Hintergrund wird's durch die abgestürzte Konsole schön aufgeräumt :-)

Gruß,
Jens
BMelchert
Foren-Mitglied
Beiträge: 105
Registriert: 29. Jun 2009, 19:38

Re: Externes Programm innerhalb der Konsole starten

Beitrag von BMelchert »

Hallo,
jensw hat geschrieben:[100% CPU-Last]
Vollkommen klar, die Messageqeue wird ja auch gnadenlos zugeballert. Man könnte jetzt noch ein Sleep() einfügen...
Aber vergessen wir den Mist besser.

jensw hat geschrieben: Die Thread-Lösung funktioniert nach der Korrektur (workerThread.Start();) jetzt auch, Mediaport startet, dafür schmiert die HomeServerConsole selbst ab --> wenn man remote an der HomeServer-Konsole angemeldet ist startet Mediaport und im Hintergrund wird's durch die abgestürzte Konsole schön aufgeräumt :-)
die Konsole sollte eigentlich nicht abstürzen, ich habe das mal gestestet. Bei mir funktioniert das ca. so:

Code: Alles auswählen

    private void DoWork(object sender, DoWorkEventArgs e)
    {
      // Hier wird garbeitet.
      BackgroundWorker worker = sender as BackgroundWorker;

      ProcessStartInfo startInfo = new ProcessStartInfo();
      
      startInfo.FileName = "regedit.exe";
      
      try
      {
        using (Process exeProcess = Process.Start(startInfo))
        {
          exeProcess.WaitForExit();
          e.Result = exeProcess.ExitCode;
        }
      }
      catch
      {
        // Fehlerbehandlung!  
      }  
    }

    private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      // Hier kann der Rückgabewert ausgewertet werden...
      switch ((int)e.Result)
      {
         default: break;
      }
    }

    private void qButton1_Click(object sender, EventArgs e)
    {
      // Hier wird der Thread gestartet.
      BackgroundWorker bw = new BackgroundWorker();

      bw.DoWork += new DoWorkEventHandler(DoWork);
      bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);

      bw.RunWorkerAsync();
    }
großteils direkt aus Doku übernommen, funktioniert problemlos.
Ich hoffe das hilft dir ein bisschen weiter.

cu,
Bernd
WHS: Acer H340 (6 TB)
jensw
Foren-Einsteiger
Beiträge: 22
Registriert: 12. Mai 2009, 20:23

Re: Externes Programm innerhalb der Konsole starten

Beitrag von jensw »

Hallo Bernd,

funktioniert einwandfrei... Danke!

Viele Grüße
Jens
Antworten