Seite 1 von 1

Externes Programm innerhalb der Konsole starten

Verfasst: 19. Sep 2009, 18:53
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

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 19. Sep 2009, 21:42
von AndreasM
Was heisst denn "geht nicht"? Kannst Du mal beschreiben was nicht geht und welche Fehlermeldung/Exception Du bekommst?

Andreas M.

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 19. Sep 2009, 22:08
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

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 20. Sep 2009, 10:22
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

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 20. Sep 2009, 17:42
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

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 20. Sep 2009, 18:19
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

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 20. Sep 2009, 18:33
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

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 20. Sep 2009, 18:44
von AliG
Hi!

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

Code: Alles auswählen

workerThread.Start();
lg Alex

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 20. Sep 2009, 19:14
von jensw
Hallo,

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


Grüße
Jens

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 21. Sep 2009, 22:53
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

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 22. Sep 2009, 18:56
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

Re: Externes Programm innerhalb der Konsole starten

Verfasst: 23. Sep 2009, 20:20
von jensw
Hallo Bernd,

funktioniert einwandfrei... Danke!

Viele Grüße
Jens