
[SOLVED] TProcess + Java | Parameter nicht richtig genutzt ?
-
- 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 ?
Gerade etwas rumprobiert:
Starten:
... funktioniert 
Auslesen: (Multi-Thread, damit das Programm auch wärend des Auslesens weiterläuft (also 90% der Gesamtzeit))
... 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
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

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;
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] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
Habe mal deinen Code angepasst, so läuft er bei mir (allerdings habe ich kein Java sondern eine Test-Konsolen-Programm ausgeführt):
Output wird in Form1.Memo1 angezeigt, müsstest du noch anpassen.
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;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- 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 ?
Teste ich, melde mich dann zurückMichl 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):Output wird in Form1.Memo1 angezeigt, müsstest du noch anpassen.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;

------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
-
- 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 ?
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
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] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
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;
-
- 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 ?
Jup, das geht, scheint also mit Java zu tun zu haben :/Michl hat geschrieben:Ich habe dir mal mein kleines Testprog angehangen, sollte doch laufen?!
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
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
...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;
-
- 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 ?
Teste ich nacher/gleich, habe g'rade nicht viel Zeit, aber schonmal DankeMichl 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

------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
-
- 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 ?
Zwei Fragen:
1. was genau erwartest du, das passieren soll?
2. was passiert aktuell?
1. was genau erwartest du, das passieren soll?
2. was passiert aktuell?
-
- 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 ?
mark332 hat geschrieben:Teste ich nacher/gleich, habe g'rade nicht viel Zeit, aber schonmal DankeMichl 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
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] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
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.mark332 hat geschrieben:Ich habe deinen Code komplett rauskopiert und sogar deine .jar genutzt, aber irgendwie kommt bei mir nichts raus :OOO
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;
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;
-
- 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 ?
Okey, ich habe es gerade ohneMichl hat geschrieben: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.mark332 hat geschrieben:Ich habe deinen Code komplett rauskopiert und sogar deine .jar genutzt, aber irgendwie kommt bei mir nichts raus :OOO
Das liegt daran, dass die Leerzeichen im Pfadnamen, trotz Pfadname in Hochklammern, als Parametertrenner gelesen werden (getestet per Ausgabe auf Konsole).
Probier malSo sollte das Bsp. dann auch bei dir laufen (Java in Windows registriert).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;
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
javaProcess.Options := [poUsePipes];
javaProcess.ShowWindow := swoHide;
Sehe ich das richtig ?
MfG
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
Es hat sich doch nun das Konsolefenster geöffnet, was steht denn da drin?!mark332 hat geschrieben:versucht, und ich sehe keine fehlermeldung... was für mich jetzt bedeutet: >>Lazarus updaten<<
Sehe ich das richtig ?
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;
-
- 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 ?
Die Konsole geht auf und es laufen die normalen Meldungen durch, keine Fehlermeldung im Bezug auf Pfade oder Argumente...Michl hat geschrieben:Es hat sich doch nun das Konsolefenster geöffnet, was steht denn da drin?!mark332 hat geschrieben:versucht, und ich sehe keine fehlermeldung... was für mich jetzt bedeutet: >>Lazarus updaten<<
Sehe ich das richtig ?
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.
( 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] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?