2009-05-26 2 views
3

Ich habe einen Prozess erstellt, der auf die Datei Java.exe abzielt. Der Prozess sollte eine Java.jar-Serverdatei ausführen und weiterhin ausgeführt werden, um eine Ausgabe-Rückmeldung zu geben, bis der Server abstürzt oder ich ihn zwangsweise herunterfahre. Alles funktioniert gut .. der Server läuft .. und wenn ich UseShellExecute auf True gesetzt habe, kann ich das schwarze CMD-Fenster sehen, das die gesamte Ausgabe zurückgibt. Aber wenn ich es auf false setze und die Ausgabe umleite ... ist das Fenster komplett leer (der Server läuft noch) und das OutputDataReceived Event feuert überhaupt nicht (ich glaube ich habe es einmal bekommen aber das war als ich schloss das Fenster, es schien, dass die Argumente leer waren) und soweit ich sehen kann, gibt Standardoutput.ReadToEnd() auch nichts zurück. Warum gibt dieser Prozess keine Ausgangsrückmeldung zurück? Hier ist mein Code:C#: Warum funktioniert mein Prozess, der Java.exe ausführt, einwandfrei, aber das Fenster gibt keine Ausgabe zurück?

gameServerProcess = new Process(); 
    gameServerProcess.StartInfo.UseShellExecute = false; 
    gameServerProcess.StartInfo.RedirectStandardOutput = true; 
    gameServerProcess.StartInfo.RedirectStandardInput = true; 

    gameServerProcess.EnableRaisingEvents = true; 
    gameServerProcess.Exited += new EventHandler(gameServer_WindowExit); 

    window = new ServerWindow(); 
    gameServerProcess.OutputDataReceived += new DataReceivedEventHandler(window.server_recievedOutputStream); 
    window.Show(); 

    gameServerProcess.StartInfo.FileName = @"D:\Program Files\Java\jdk1.6.0_12\bin\java.exe"; 
    gameServerProcess.StartInfo.WorkingDirectory = @"D:\Users\Zack\Desktop\ServerFiles\gameserver"; 
    gameServerProcess.StartInfo.Arguments = @"-Xmx1024m -cp ./../libs/*;l2jserver.jar net.sf.l2j.gameserver.GameServer"; 
    gameServerProcess.Start(); 
    gameServerProcess.BeginOutputReadLine(); 

Und meine ‚Fenster‘ Formularklassencode, der die DataReceivedEventArgs mit den Ausgangsdaten erhalten soll:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Diagnostics; 

namespace MWRemoteServer 
{ 
    public partial class ServerWindow : Form 
    { 
     private delegate void WriteOutputDelegate(string output); 
     private WriteOutputDelegate writeOutput; 

     public ServerWindow() 
     { 
      InitializeComponent(); 
      logBox.BackColor = Color.White; 
      logBox.ForeColor = Color.Black; 
      writeOutput = new WriteOutputDelegate(write); 
     } 

     public void server_recievedOutputStream(object sender, DataReceivedEventArgs args) 
     { 
      MessageBox.Show("Called window output!"); 
      if (args.Data != null) 
      { 
       BeginInvoke(writeOutput, new object[] { args.Data.ToString() }); 
      } 
     } 

     private void write(string output) 
     { 
      logBox.AppendText(output + Environment.NewLine); 
     } 
    } 
} 

Auch der Prozess funktioniert völlig in Ordnung und mit der UseShellExecute auf true gesetzt Ich kann sehen, dass es alle Informationen liefert, die ich ergreifen muss. Aber wenn ich das auf "false" setze ist es leer und ich kann keine Ausgabedaten erfassen!

Vielen Dank im Voraus ... Ich habe stundenlang auf diese gewesen ...

Antwort

2

Sind Sie sicher, dass es nach stdout schreibt? Haben Sie versucht, stderr zu überprüfen? (RedirectStandardError/StandardError/ErrorDataReceived/BeginErrorReadLine).

Wenn es direkt in den Anzeigepuffer schreibt (anstelle von stderr/stdout), dann ist es möglicherweise nicht möglich, ohne eine Los Arbeit.

+0

OMFG Es scheint, es wurde an die stderr schreibt ??? Warum zum Teufel würde es tun, dass es für einen Grund "Standard" "Ausgang" genannt wird! Vielen Dank ! – OneShot

Verwandte Themen