[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

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von mark332 »

[inaktuell ;) ]

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 »

Gerade etwas rumprobiert:

Starten:

Code: Alles auswählen

 
   begin
      BytesRead := 0;
      MemStrm := TMemoryStream.Create;
      javaProcess := TProcess.Create(nil);
 
      try
        javaProcess.Executable := javaPath; //auszuführendes Programm
        javaProcess.Parameters.Add('-jar');
        javaProcess.Parameters.Add('"' + serverPath + '"');
        javaProcess.Parameters.add('nogui');
        javaProcess.CurrentDirectory:=ExtractFileDir(serverPath);
        javaProcess.Options := [poUsePipes];
        javaProcess.ShowWindow := swoHide; //Fenster der Konsole nicht anzeigen
        javaProcess.Execute;
      finally
        javaProcessRunning := True;
        //Timer_getConsole.enabled:=true;
        DownloadThreadFinish := False;
        testThread := DownloadThread.Create(False);
      end;
    end
 
... funktioniert :)

Auslesen: (Multi-Thread, damit das Programm auch wärend des Auslesens weiterläuft (also 90% der Gesamtzeit))

Code: Alles auswählen

 
procedure DownloadThread.Execute;
var
  i: integer;
  bla: TStringList;
begin
  bla := TStringList.Create;
  while javaProcess.Running do
  begin
    // stellt sicher, dass wir Platz haben
    MemStrm.SetSize(BytesRead + READ_BYTES);
 
    // versuche, es zu lesen
    n := javaProcess.Output.Read((MemStrm.Memory + BytesRead)^, READ_BYTES);
    if n > 0 then
    begin
      Inc(BytesRead, n);
    end
    else
    begin
      // keine Daten, warte 50 ms
      Sleep(50);
    end;
    // lese den letzten Teil
    repeat
      // stellt sicher, dass wir Platz haben
      MemStrm.SetSize(BytesRead + READ_BYTES);
      // versuche es zu lesen
      n := javaProcess.Output.Read((MemStrm.Memory + BytesRead)^, READ_BYTES);
      if n > 0 then
      begin
        Inc(BytesRead, n);
      end;
    until n <= 0;
    MemStrm.SetSize(BytesRead);
 
    //Ausgabe
    bla.LoadFromStream(MemStrm);
    for i := 0 to bla.Count - 1 do
    begin
      Form_main.Memo_console.Lines.add(bla[i]);
    end;
  try
    Form_main.Memo_console.Lines.add('TEST');
  finally
    //brauche hier nichts ;)
  end;
  end;
  DownloadThreadFinish := True;
end;
... funktioniert nicht wirklich.... :/
Der Thread soll den Output auslesen und dann in das Memo "Memo_console" schreiben, stattdessen tut er garnichts, bis der javaProcess beendet wird, und schreibt dann auch nur das ganz unten stehende "Test" hineint...

Kann mir einer von euch den (hoffentlich) letzten "Schubs" zur Lösung geben ;D ?

MfG

mark332
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

Habe mal deinen Code angepasst, so läuft er bei mir (allerdings habe ich kein Java sondern eine Test-Konsolen-Programm ausgeführt):

Code: Alles auswählen

procedure TDownloadThread.Execute;
var
  BytesRead, n, i: integer;
  bla: TStringList;
 
const
  READ_BYTES = 2048;
 
begin
  bla := TStringList.Create;
  BytesRead:=0;
 
  while javaProcess.Running do begin
 
  // stellt sicher, dass wir Platz haben
    MemStrm.SetSize(BytesRead + READ_BYTES);
 
    // versuche, es zu lesen
    n := javaProcess.Output.Read((MemStrm.Memory + BytesRead)^, READ_BYTES);
    if n > 0 then Inc(BytesRead, n);
 
    // lese den letzten Teil
    repeat
      // stellt sicher, dass wir Platz haben
      MemStrm.SetSize(BytesRead + READ_BYTES);
      // versuche es zu lesen
 
      if javaProcess.Output.NumBytesAvailable > 0 then  //Kongret habe ich diese Zeile eingefügt, da sonst mit Read der Thread blockiert wird
        n := javaProcess.Output.Read((MemStrm.Memory + BytesRead)^, READ_BYTES)
      else
        n:=0;
 
      if n > 0 then
        Inc(BytesRead, n);
 
      until n <= 0;
 
    MemStrm.SetSize(BytesRead);
 
    //Ausgabe
    bla.LoadFromStream(MemStrm);
    for i := 0 to bla.Count - 1 do
      Form1.Memo1.Lines.add(bla[i]);
 
  end;
end; 
Output wird in Form1.Memo1 angezeigt, müsstest du noch anpassen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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 »

Michl hat geschrieben:Habe mal deinen Code angepasst, so läuft er bei mir (allerdings habe ich kein Java sondern eine Test-Konsolen-Programm ausgeführt):

Code: Alles auswählen

procedure TDownloadThread.Execute;
var
  BytesRead, n, i: integer;
  bla: TStringList;
 
const
  READ_BYTES = 2048;
 
begin
  bla := TStringList.Create;
  BytesRead:=0;
 
  while javaProcess.Running do begin
 
  // stellt sicher, dass wir Platz haben
    MemStrm.SetSize(BytesRead + READ_BYTES);
 
    // versuche, es zu lesen
    n := javaProcess.Output.Read((MemStrm.Memory + BytesRead)^, READ_BYTES);
    if n > 0 then Inc(BytesRead, n);
 
    // lese den letzten Teil
    repeat
      // stellt sicher, dass wir Platz haben
      MemStrm.SetSize(BytesRead + READ_BYTES);
      // versuche es zu lesen
 
      if javaProcess.Output.NumBytesAvailable > 0 then  //Kongret habe ich diese Zeile eingefügt, da sonst mit Read der Thread blockiert wird
        n := javaProcess.Output.Read((MemStrm.Memory + BytesRead)^, READ_BYTES)
      else
        n:=0;
 
      if n > 0 then
        Inc(BytesRead, n);
 
      until n <= 0;
 
    MemStrm.SetSize(BytesRead);
 
    //Ausgabe
    bla.LoadFromStream(MemStrm);
    for i := 0 to bla.Count - 1 do
      Form1.Memo1.Lines.add(bla[i]);
 
  end;
end; 
Output wird in Form1.Memo1 angezeigt, müsstest du noch anpassen.
Teste ich, melde mich dann zurück :)
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

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 »

Sop, habe jetzt getestet, nur ist das Verhalten bei mir genau das selbe, wie vorher :/

ich würde ja vermuten, dass der Java-Prozess keinen Output gibt, das wäre aber falsch, weil ich genau weiß, dass er das tut, ebenfalls würde das nach meiner Sicht auch nicht erklären, warum das 'TEST' erst nach Beendigung des Prozesses geschrieben wird, obwohl es in der Schleife steht :/

MfG
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

Ich habe dir mal mein kleines Testprog angehangen, sollte doch laufen?!
Dateianhänge
Test.zip
(235.02 KiB) 112-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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 »

Michl hat geschrieben:Ich habe dir mal mein kleines Testprog angehangen, sollte doch laufen?!
Jup, das geht, scheint also mit Java zu tun zu haben :/
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

Hast du schon mal versucht java mit per cmd zu öffnen?!

...wollte Code einfügen, das lässt der Forumserver nicht zu...

Also per Zip -> anbei
Dateianhänge
TestJava.zip
(130.49 KiB) 95-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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 »

Michl hat geschrieben:Hast du schon mal versucht java mit per cmd zu öffnen?!

...wollte Code einfügen, das lässt der Forumserver nicht zu...

Also per Zip -> anbei
Teste ich nacher/gleich, habe g'rade nicht viel Zeit, aber schonmal Danke :D
------------------------------------------------------------
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 »

Zwei Fragen:

1. was genau erwartest du, das passieren soll?
2. was passiert aktuell?

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 »

mark332 hat geschrieben:
Michl hat geschrieben:Hast du schon mal versucht java mit per cmd zu öffnen?!

...wollte Code einfügen, das lässt der Forumserver nicht zu...

Also per Zip -> anbei
Teste ich nacher/gleich, habe g'rade nicht viel Zeit, aber schonmal Danke :D

Okeeey, das ist jetzt Strange :O
Ich habe deinen Code komplett rauskopiert und sogar deine .jar genutzt, aber irgendwie kommt bei mir nichts raus :OOO

(Im Übrigen habe ich eig. im Sinn, dass mein Programm auch auf Linux laufen könnte, womit die cmd logischerweise keine tolle lösung ist, Aber das kann auch noch warten ;) )
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

mark332 hat geschrieben:Ich habe deinen Code komplett rauskopiert und sogar deine .jar genutzt, aber irgendwie kommt bei mir nichts raus :OOO
Ich hatte unter Lazarus 1.3 und FPC 2.7.1 getestet, alles prima. Eben unter Lazarus1.0.12 getestet, da läuft das Bsp bei mir auch nicht.
Das liegt daran, dass die Leerzeichen im Pfadnamen, trotz Pfadname in Hochklammern, als Parametertrenner gelesen werden (getestet per Ausgabe auf Konsole).

Probier mal

Code: Alles auswählen

    javaProcess.Executable := 'java';                                           
    javaProcess.Parameters.Add('-jar');
    javaProcess.Parameters.Add('Hello.jar');  //Hello.jar liegt im Projektverzeichnis
    javaProcess.Options := [poUsePipes];
    javaProcess.ShowWindow := swoHide; 
    javaProcess.Execute;  
So sollte das Bsp. dann auch bei dir laufen (Java in Windows registriert).

Evtl. ist dies auch dein Ausgangsproblem. Schau dir doch mal die Ausgabe in der Konsole an, ohne die Umleitung in den Pipe und ohne Thread, dann müsstest du die Fehlermeldung sehen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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 »

Michl hat geschrieben:
mark332 hat geschrieben:Ich habe deinen Code komplett rauskopiert und sogar deine .jar genutzt, aber irgendwie kommt bei mir nichts raus :OOO
Ich hatte unter Lazarus 1.3 und FPC 2.7.1 getestet, alles prima. Eben unter Lazarus1.0.12 getestet, da läuft das Bsp bei mir auch nicht.
Das liegt daran, dass die Leerzeichen im Pfadnamen, trotz Pfadname in Hochklammern, als Parametertrenner gelesen werden (getestet per Ausgabe auf Konsole).

Probier mal

Code: Alles auswählen

    javaProcess.Executable := 'java';                                           
    javaProcess.Parameters.Add('-jar');
    javaProcess.Parameters.Add('Hello.jar');  //Hello.jar liegt im Projektverzeichnis
    javaProcess.Options := [poUsePipes];
    javaProcess.ShowWindow := swoHide; 
    javaProcess.Execute;  
So sollte das Bsp. dann auch bei dir laufen (Java in Windows registriert).

Evtl. ist dies auch dein Ausgangsproblem. Schau dir doch mal die Ausgabe in der Konsole an, ohne die Umleitung in den Pipe und ohne Thread, dann müsstest du die Fehlermeldung sehen.
Okey, ich habe es gerade ohne

Code: Alles auswählen

    javaProcess.Options := [poUsePipes];
    javaProcess.ShowWindow := swoHide; 
versucht, und ich sehe keine fehlermeldung... was für mich jetzt bedeutet: >>Lazarus updaten<<

Sehe ich das richtig ?

MfG
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

mark332 hat geschrieben:versucht, und ich sehe keine fehlermeldung... was für mich jetzt bedeutet: >>Lazarus updaten<<

Sehe ich das richtig ?
Es hat sich doch nun das Konsolefenster geöffnet, was steht denn da drin?!

PS: falls das Konsolefenster sich öffnet und sofort wieder schließt, musst du noch den Haken bei Projekt -> Projekteinstellungen -> Compilereinstellungen -> Konfiguration und Ziele -> Win32-Gui-Anwendung weg machen. Dann bleibt die Konsole sichtbar.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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 »

Michl hat geschrieben:
mark332 hat geschrieben:versucht, und ich sehe keine fehlermeldung... was für mich jetzt bedeutet: >>Lazarus updaten<<

Sehe ich das richtig ?
Es hat sich doch nun das Konsolefenster geöffnet, was steht denn da drin?!

PS: falls das Konsolefenster sich öffnet und sofort wieder schließt, musst du noch den Haken bei Projekt -> Projekteinstellungen -> Compilereinstellungen -> Konfiguration und Ziele -> Win32-Gui-Anwendung weg machen. Dann bleibt die Konsole sichtbar.
Die Konsole geht auf und es laufen die normalen Meldungen durch, keine Fehlermeldung im Bezug auf Pfade oder Argumente...
( Im übrigen jetzt auch, wenn ich den Java-Pfad als executable nehme :) )


EDIT: "YES, 100ster Beitrag :DD"
Zuletzt geändert von mark332 am Mo 4. Nov 2013, 14:04, insgesamt 1-mal geändert.
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Antworten