[SOLVED] TProcess + Java | Parameter nicht richtig genutzt ?

Für Fragen von Einsteigern und Programmieranfängern...
mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

[SOLVED] TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

Hi Leute, ich versuche aus meinem Programm heraus eine Java-Konsole mit einer .jar als Argument zu starten,
Befehl, wie er in einer Batch-Datei stehen würde:

Code: Alles auswählen

(JavaPfad durch user definiert) -jar (.jar Pfad durch User definiert)


Code in meinem Programm

Code: Alles auswählen

 
      javaProcess := TProcess.Create(nil);
      javaProcess.Executable := javaPath;
      //javaProcess.Parameters.add('-Xmx2048M '); wegen dem Fehler auskommentiert!
      //javaProcess.Parameters.add('-Xms2048M '); wegen dem Fehler auskommentiert!
      javaProcess.Parameters.add('-jar ' + serverPath); // '-jar '+bla gibt fehler 'jar '+bla startet und schließt sofort wieder...
      javaProcess.Options := [poUsePipes];
      javaProcess.Execute;
      javaProcessRunning := True;

Die Pfade javaPath und serverPath sind 100% richtig, da diese in einer Batch, die Konsole ohne Probleme starten...
Ebenfalls liegt der Fehler nicht bei [poUsePipes], da auch ohne, exakt das Selbe passiert...
leider brauche ich [poUsePipes] da ich den Output der konsole auffangen muss um ihn in meinem Programm verwenden zu können...

Hat einer von euch eine Idee, warum die Konsole nicht korrekt gestartet wird?

MfG mark332

PS: Der im CodeBlock oben angegebene Fehler ist nicht mehr als "Could not create the Java Virtual Machine: Fatal Error"

PSS: Auch wenn das von mir Gewollte an sich eher komplexer ist, habe ich den Post in Einsteigerfragen gestellt, da ich persönlich, weder alle Fachbegriffe kenne, noch eine, als "sauber" nennbare, code-Formatierung habe :$ Wenn ihr Irgendetwas nicht versteht, fragt nach und ich versuche, meine Gedankengänge zu erklären... :)
Zuletzt geändert von mark332 am Do 7. Nov 2013, 17:34, insgesamt 1-mal geändert.

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Achtzig »

Enthält der Pfad denn Leerzeichen? Wenn ja, solltest Du die Pfadangabe in doppelte Anführungsstriche setzen, damit das als 1 Parameter erkannt wird und nicht als mehrere.

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

Achtzig hat geschrieben:Enthält der Pfad denn Leerzeichen? Wenn ja, solltest Du die Pfadangabe in doppelte Anführungsstriche setzen, damit das als 1 Parameter erkannt wird und nicht als mehrere.


Der Pfad nicht, aber java brauch zwischen dem Argument '-jar' und dem Pfad ein Leerzeichen, könnte hier der Fehler liegen ?

df.id
Beiträge: 20
Registriert: Fr 23. Mai 2008, 00:29
OS, Lazarus, FPC: Windows|Linux (L 2.0.6 FPC 3.0.4)
CPU-Target: Intel
Wohnort: Münster
Kontaktdaten:

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von df.id »

Jeder Parameter bei TProcess muß einzeln gesetzt werden. -jar und serverPath sind getrennte Parameter und dürfen daher nicht zusammen übergeben werden.

Sobald (oder immer) ein Space in einem Parameter enthalten ist, quotet tProcess diese. Im Batch würde

Code: Alles auswählen

java "-jar server.jar"
auch "Unrecognized option" / "Could not create the Java Virtual Machine." liefern.

So könnte es klappen:

Code: Alles auswählen

 
javaProcess := TProcess.Create(nil);
javaProcess.Executable := javaPath;
javaProcess.Parameters.add('-jar');
javaProcess.Parameters.add(serverPath);
javaProcess.Options := [poUsePipes];
javaProcess.Execute;
 

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

df.id hat geschrieben:Jeder Parameter bei TProcess muß einzeln gesetzt werden. -jar und serverPath sind getrennte Parameter und dürfen daher nicht zusammen übergeben werden.

Sobald (oder immer) ein Space in einem Parameter enthalten ist, quotet tProcess diese. Im Batch würde

Code: Alles auswählen

java "-jar server.jar"
auch "Unrecognized option" / "Could not create the Java Virtual Machine." liefern.

So könnte es klappen:

Code: Alles auswählen

 
javaProcess := TProcess.Create(nil);
javaProcess.Executable := javaPath;
javaProcess.Parameters.add('-jar');
javaProcess.Parameters.add(serverPath);
javaProcess.Options := [poUsePipes];
javaProcess.Execute;
 


Danke für die AW, ich werde das mal versuchen, sobald ich Zeit habe :) und melde mich dann, obs geht :D

MfG

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

Hmm... hab's gerade mal getestet...

leider bleibt es irgendwie das selbe Problem...

Komisch finde ich auch, dass ich mit dem Prozess auch einen Timer starte, der den Output des Prozesses abfangen soll, dieser aber, trotz der Tatsache, dass der Prozess scheinbar sofort abstürzt, keine Fehlermeldung ausgibt.... ?!?

MfG

mark332

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von creed steiger »

Timer?
Für was einen Timer?

Könnte auch sein das der Output einfach zu groß ist.

http://wiki.freepascal.org/Executing_Ex ... s#TProcess

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

creed steiger hat geschrieben:Timer?
Für was einen Timer?

Könnte auch sein das der Output einfach zu groß ist.

http://wiki.freepascal.org/Executing_Ex ... s#TProcess


Soweit bin ich ja leider noch nicht...
So wie es aussieht, wird der Java-prozess gestartet und sofort wieder beendet...
Was mich nur wunderte, ist, dass die Prozedur zum auslesen keinen Fehler gibt, wobei ich gerade merke, dass diese nur aufgerufen wird, wenn 'javaProcess.Running' true ist...

MfG

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

Ich habe mir gerade überlegt, ob es möglich wäre, eine .bat mit dem entsprechendem Befehl auszuführen, ich weiß allerdings nicht, ob ich bei dieser den Output auslesen, bzw. einen Input geben, kann... Was sagt ihr dazu ?

Ebenfalls habe ich mir überlegt, diese Frage evtl. auch in einem Java-Forum zu stellen... Hier Meinungen eurerseits ?

Im Übrigen ist mir noch etwas weiteres aufgefallen:
Sobald man das Programm aus Lazarus raus startet, und der besagte TProcess ausgeführt wird, scheint der Debugger nicht mehr ganz zu wollen, da, wenn man das Programm nun schließt, dieser das Schließen nicht bemerkt und stattdessen eine Fehlermeldung ausgibt...:

Code: Alles auswählen

 
Debuggerfehler!
Der Debugger ist abgestürzt.
Speichern sie ihre Arbeit !
 
Drücken sie >>OK<< und hoffen sie auf einen Fix für diesen Fehler.
 
The GDB Process is no longer running.
 


Ich habe mal folgendes genommen, um zu testen, ob der Prozess noch läuft...

Code: Alles auswählen

 
begin
  if javaProcessRunning then
  begin
      if javaProcess.Running then begin
        javaProcess.Terminate(0);
      end
      else begin
        ShowMessage('Not running!'); // <--- wird ausgegeben
      end;
  end;
end;
 


Hat jemand eine Idee zur Lösung des Problem, oder vielleicht eine mögliche Alternative ?

MfG

mark332

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von carli »

mark332 hat geschrieben:Hat einer von euch eine Idee, warum die Konsole nicht korrekt gestartet wird?


Weil du mit poUsePipes sagst, dass du keine Konsole starten willst, sondern die Ein- und Ausgabe in dein Programm umleiten willst. Du kannst die Ein- und Ausgabe des Prozesses über die TStream-Klasse ansprechen.

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

carli hat geschrieben:
mark332 hat geschrieben:Hat einer von euch eine Idee, warum die Konsole nicht korrekt gestartet wird?


Weil du mit poUsePipes sagst, dass du keine Konsole starten willst, sondern die Ein- und Ausgabe in dein Programm umleiten willst. Du kannst die Ein- und Ausgabe des Prozesses über die TStream-Klasse ansprechen.


Danke für deine AW :)

Hast du da evtl. einen Link zur hilfe für mich :$ ?

Edit: Habe gerade mal ohne poUsePipes gestartet... leider immernoch das selbe Problem...
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von carli »

Du musst bei poUsePipes die Ausgabe der Ausführung auslesen. Wenn du das nicht machst, kann das Programm auch blockieren, wenn der Puffer voll ist.

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

carli hat geschrieben:Du musst bei poUsePipes die Ausgabe der Ausführung auslesen. Wenn du das nicht machst, kann das Programm auch blockieren, wenn der Puffer voll ist.


Hmm... klingt einleuchtend ;D
Und wie stelle ich das an ?

MfG


mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

creed steiger hat geschrieben:nochmal:

http://wiki.freepascal.org/Executing_Ex ... s#TProcess


Hmm... ich habs jetzt mal so versucht:

Start:

Code: Alles auswählen

 
  MemStream := TMemoryStream.Create;
  BytesRead := 0;
  JavaProcess := TProcess.Create(nil);
  javaProcess.Executable := javaPath;
  javaProcess.Parameters.add('jar ');
  javaProcess.Parameters.add('"'+serverPath+'"');
  javaProcess.Options := [poUsePipes];
  javaProcess.Execute;
  javaProcessRunning := True;
 


Auslesen:

Code: Alles auswählen

 
    if javaProcess.Running then
    begin
      // make sure we have room
      MemStream.SetSize(BytesRead + READ_BYTES);
 
      // try reading it
      NumBytes := javaProcess.Output.Read((MemStream.Memory + BytesRead)^, READ_BYTES);
      if NumBytes > 0 then begin
        Inc(BytesRead, NumBytes);
      end
      else begin
        // no data, wait 100 ms
        //Sleep(100);
      end;
    // read last part
    repeat
      // make sure we have room
      MemStream.SetSize(BytesRead + READ_BYTES);
      // try reading it
      NumBytes := javaProcess.Output.Read((MemStream.Memory + BytesRead)^, READ_BYTES);
      if NumBytes > 0
      then begin
        Inc(BytesRead, NumBytes);
        //Write('.');
      end;
    until NumBytes <= 0;
    if BytesRead > 0 then WriteLn;
    MemStream.SetSize(BytesRead);
    //WriteLn('-- External program run complete');
 
    OutputLines := TStringList.Create;
    OutputLines.LoadFromStream(MemStream);
    Memo_console.lines:=OutputLines;
 


Scheint aber irgendwie immernoch das selbe zu passieren... :/

Antworten