none
Java Konsolenanwendungs output in richTextBox RRS feed

  • Frage

  • Hi,

    ich bin relativ unerfahren im Bereich C#, würde aber gerne den output einer Java Konsolenanwendung in eine richTextBox meiner Form übertragen. Nun habe ich schon im Internet nach verschieden Lösungswegen gesucht, jedoch brachte weder der Streamreader noch der Standeroutput den gewünschten Erfolg. Hier schonmal meinen Code und ich hoffe ihr könnt mir helfen.

    Grüße Brainiak

            string output;
            public void start()
    
            {
                
                string Ram = Convert.ToString(numericUpDown1.Value);
                string Name = textBox2.Text;
                string JPfad = textBox1.Text;
    
                Process Server = new Process();
                Server.StartInfo.FileName = @JPfad;
                Server.StartInfo.UseShellExecute = false;
                Server.StartInfo.CreateNoWindow = false;
                Server.StartInfo.RedirectStandardOutput = true;           
                Server.StartInfo.Arguments ="-Xincgc -Xmx" + Ram + "G -jar " + Name;
                Server.Start();
                ID = Server.Id;
                output = Server.StandardOutput.ReadToEnd();
           }
    
            
            private void button1_Click(object sender, EventArgs e)
            {
                 start();
                 richTextBox1.Text = output;
                        
            }

    PS: Bei der Anwendung handelt es sich um einen Server, und deshalb sollte der Inhalt der TextBox ständig aktualisiert werden.

    Sonntag, 11. März 2012 20:15

Antworten

  • Wie Du dir vielleicht vorstellen kannst, bin ich kein Bukkit-Spezialist... Ich habe die von dir verlinkte Datei dennoch heruntergeladen und installiert, hier der Inhalt von run.bat:

    REM @ECHO OFF
    SET BINDIR=%~dp0
    CD /D "%BINDIR%"
    "%ProgramFiles%\Java\jre7\bin\java.exe" -Xmx1024M -Xms1024M -jar craftbukkit.jar
    PAUSE

    Anschließend konnte ich über asynchrones Lesen und Control.Invoke() problemlos aus dem Ausgabestrom lesen, und zwar genau das, was ich beim direkten Ausführen auch gelesen hätte. Natürlich bin ich nicht so weit gegangen, Clients zu connecten, aber - wie soll ich's sagen - ich sehe hier kein weiteres C#-Problem.

    Gruß
    Marcel

    Montag, 12. März 2012 17:19
    Moderator

Alle Antworten

  • Hallo Brainiak,

    Mit StandardOutput.ReadToEnd() kommt man nicht sehr weit wenn man den Inhalt der TextBox aus StandardOutput ständig aktualisieren soll. Da muss man schon asynchron arbeiten. Du könntest z.B. Server.OutputDataReceived abonnieren, Server.Start() und Server.BeginOutputReadLine() aufrufen,  und anschließend das OutputDataReceived-Ereignis entspr. behandeln.

    Etwas detailliertere Informationen zum Verhalten deiner Anwendung wären natürlilch hilfreich: Funktioniert denn die Java-Anwendung mit genau den oben angegebenen Parametern und *vor* der Umleitung problemlos? Erhältst Du nach der Umleitung des Ausgabestroms irgendwelche Fehlermeldungen? Was passiert denn überhaupt wenn Du den oben abgedruckten Code ausführst?

    Gruß
    Marcel

    Montag, 12. März 2012 10:37
    Moderator
  • Danke schonmal für deine schnelle Antwort

    Die von dir beschrieben Antwort habe ebenfalls schon ausprobiert. Als ich dann den output mit textBox1.Text = e.Data übertragen wollte bekam ich folgendes Error :                                  

    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement textBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Bei der Javakonsolenanwendung handelt es sich um den Minecraft Bukkit Server (Hier zum Download Bukkit) und ja vor der Umleitung des Outputs startet der Server ganz normal mit den angegebenen Parametern. Beim Ausführen des obrigen Codes Startet der Server auch und der Output ist wie zu erwarten nicht in der Konsole zu sehen, doch leider auch nicht in der Textbox. Wenn ich dann den Server wieder schließe, erscheint ein unvollständiger output, der nur aus den ersten beiden Zeilen und >>>>>>>>>>> besteht, in der Textbox.

    Gruß Brainiak

    Montag, 12. März 2012 14:28
  • Hi,

    Verwende statt der direkten Zuweisung an die TextBox einen Aufruf von Control.Invoke(). Damit löst Du schon mal das Threadingproblem.
    Überprüfe ferner, ob im Fehlerstrom nicht etwaige Fehler zu finden sind. Ich sehe mir das Download etwas später an.

    Gruß
    Marcel

    Montag, 12. März 2012 15:10
    Moderator
  • Danke damit wäre das behoben mein Code lautet also:

    textBox1.Invoke((MethodInvoker)delegate 
                {
                    textBox1.Text = e.Data;
                });


    Doch leider passiert immernoch nichts.
    Montag, 12. März 2012 15:31
  • Wie Du dir vielleicht vorstellen kannst, bin ich kein Bukkit-Spezialist... Ich habe die von dir verlinkte Datei dennoch heruntergeladen und installiert, hier der Inhalt von run.bat:

    REM @ECHO OFF
    SET BINDIR=%~dp0
    CD /D "%BINDIR%"
    "%ProgramFiles%\Java\jre7\bin\java.exe" -Xmx1024M -Xms1024M -jar craftbukkit.jar
    PAUSE

    Anschließend konnte ich über asynchrones Lesen und Control.Invoke() problemlos aus dem Ausgabestrom lesen, und zwar genau das, was ich beim direkten Ausführen auch gelesen hätte. Natürlich bin ich nicht so weit gegangen, Clients zu connecten, aber - wie soll ich's sagen - ich sehe hier kein weiteres C#-Problem.

    Gruß
    Marcel

    Montag, 12. März 2012 17:19
    Moderator
  • Hallo xXBrainiakXx,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 19. März 2012 16:59
    Moderator
  • Hallo Brainiak nochmal

    Die antwort(en) haben mir sehr geholfen danke,

    doch nun stehe ich vor einem neuen Problem ich versuche nun mit meinem Programm ebenfalls noch Zeilen in der Textbox anzufügen und diese dann farblich hervorzuheben doch leider gelingt mir das mit dem Hervorheben nicht wirklich.

    Hier mein code bei dem die Nachricht zwar angezeigt, aber nicht farblich hervorgehoben wird.

            public void message (string text)
            {
                richTextBox1.SelectionStart = richTextBox1.TextLength;
                richTextBox1.AppendText(text + Environment.NewLine);
                richTextBox1.SelectionLength = text.Length;    
                richTextBox1.SelectionColor = Color.Red;
            }

    Mittwoch, 21. März 2012 14:47
  • Hallo Brainiak,

    Bitte eröffne einen neuen Thread, damit auch andere Forumsteilnehmer sich an der Diskuksion beteiligen können. Danke.

    Gruß
    Marcel

    Mittwoch, 21. März 2012 15:11
    Moderator
  • Hallo xXBrainiakXx,

    Einige wichtige Sachen sind hier im Forum zu beachten:

    Immer für eine Neue Frage einen Neuen Thread aufmachen

    Grundsätzlich ist zu jedem neuen Thema ein eigener Thread zu öffnen, denn dadurch wird die Übersicht gewahrt.

    Ein eigener Thread nutzt der Kommunikation, verhindert Spannungen und Streit und trägt der Übersichtlichkeit in einem Forum bei.

    Lösungsbeiträge als „Die Antwort“ markieren
    Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.
    [Quelle:
    Forenregeln
    ]

    Wie bewerte ich einen Beitrag?Um einen Beitrag als hilfreich zu bewerten, klicken Sie in einem beliebigen Beitrag aufAls hilfreich bewerten. Sie können Ihre Stimme nur einmal für einen Beitrag abgeben.
    [Quelle:
    Häufig gestellte Fragen
    ]

    Lies einmal folgende Links durch:

    Häufig gestellte Fragen

    How to ask a question on a professional forum

    How to ask a question

    Danke und Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 21. März 2012 15:26
    Moderator