C# Fremdes Programm starten + Eingaben senden + verarbeiten während es läuft.

derbe

Lt. Commander
Registriert
Aug. 2013
Beiträge
1.702
Hallo zusammen,

mein C# Programm startet mir eine andere Anwendung und zwar diese hier:
Das Programm was gestartet wird ist im grundegenommen eine Dosbox welches ausgaben in Textform hat.
Da dieses Programm relativ lange braucht (mehere Stunden) um etwas zu berechnen möchte ich:

1: Befehl an die Dosbox senden (wenn man an das Programm ein "s" sendet zeigt es den aktuellen status an.) Geht das mit RedirectStandardOutput ?
2: Progress Balken einbauen. (Sollte an sich kein Thema sein wenn nicht 3. wäre..)
3: Mein "Form" also die grafische Oberfläche ist inaktiv solange das Dosboxprogramm rechnet (egal ob man das fenster anzeigen lässt oder nicht).

Ich habe festgestellt das ich mein Programm wie hier recht gut auslesen kann allerdings nicht während die Dosbox läuft sondern, bekomme nur das was angezeigt wird nur NACHDEM es fertig ist.

Ich möchte aber während es noch am Rechnen ist etwas auf dem "Form" also die grafische Oberfläche anzeigen.
Außerdem möchte ich nicht das mein "Form" inaktiv wird, sieht so aus als wäre es abgestürzt da man es nicht mehr verschieben etc. kann.

Code:
using System;
    using System.Diagnostics;
    using System.IO;
     
    class Program {
        static void Main() {
            ProcessStartInfo start = new ProcessStartInfo();
            start.FileName = @"C:\MeinProgram.exe";
            start.UseShellExecute = false;
            start.RedirectStandardOutput = true;
            using (Process process = Process.Start(start)) {
                // Lesen allen Text from Process und gib ihn in der Console aus (als Beispiel)
                using (StreamReader reader = process.StandardOutput) {
                    string result = reader.ReadToEnd();
                    Console.Write(result);
                }
            }
        }
    }

Für Ideen und Lösungsansätze bin ich dankbar! :)
 
Nutze für dein Vorhabel autoit oder autohotkey.
 
Eine Möglichkeit wäre sowas in der Art:

Code:
BackgroundWorker worker;

private void Form1_Load(object sender, EventArgs e)
        {
            worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true;
            worker.WorkerSupportsCancellation = true;

            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.ProgressChanged +=
                        new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.RunWorkerCompleted +=
                       new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        }

 void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            Process proc = new Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "Pfad";
            proc.StartInfo.Arguments = "Arguments";
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            proc.StartInfo.RedirectStandardOutput = true; 
            proc.StartInfo.RedirectStandardInput = true;
            proc.Start();
            while (!proc.StandardOutput.EndOfStream)
            {
                worker.ReportProgress(0, proc.StandardOutput.ReadLine());
                // Zu 1. könntest du sowas in der Art nutzen
                if (Eingabe == true)
                        proc.StandardInput.Write("s");
            }
            proc.WaitForExit();
            proc.Close();
        }

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // Zeile für Zeile vom StandardOutput
            string result = (e.UserState.ToString());            
        }

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

        }

Aufrufen dann mit

Code:
worker.RunWorkerAsync();
 
@Matzegr Danke für deine Hilfe.

@lynxx Finde es hat mit dem Thread davor nix zu tun.
 
Du startest deine Dosbox im GUI Thread. So lang in der Dosbox gerechnet wird, blockiert deine GUI natürlich weil auf Rückgabe gewartet wird. Die Lösung dafür ist den Programmaufruf in einen neuen Thread auslagern wie Matzegr schon geschrieben hat.
 
Zurück
Oben