Und genau diese Meldungen kannst du dir per Pipe in deinem Memo anzeigen lassen. Ist es nicht das, was du wolltest?!mark332 hat geschrieben: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)
[SOLVED] TProcess + Java | Parameter nicht richtig genutzt ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
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 ?
Sobald ich poUsePipes anmache, gibt es die Meldungen leider weder in der Console, noch im Memo... :/Michl hat geschrieben:Und genau diese Meldungen kannst du dir per Pipe in deinem Memo anzeigen lassen. Ist es nicht das, was du wolltest?!mark332 hat geschrieben: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)
Genau das war ja von anfang an mein Problem... dazu kommt ja noch, dass die TestProgramme von euch aus funktioniert haben, außer, wenn ich den Code kopiert und in meinem Programm genutzt habe ...
(Wie schon gesagt, denke ich, aufgrund deines Tests, dass es auch an meiner Lazarus-Version liegen kann :/ )
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
Darf ja auch keine Ausgabe mehr im Konsolefenster kommen, diese wird ja in den Pipe/Datenstrom umgeleitet.mark332 hat geschrieben:Sobald ich poUsePipes anmache, gibt es die Meldungen leider weder in der Console, noch im Memo... :/
Glaube ich nicht, wenn die Ausgabe in der Konsole funktioniert, dann sollte die Umleitung in die Konsole ebenfalls funktionieren (bei mir lief die Abfrage dann auch in der Konsole nicht). Das eine Bsp. funktioniert doch bei dir?! Probier doch dort mal deine Javaabfrage zu machen, müsste doch laufen?! Hilfsweise könntest du auch deinen Quelltext posten, evtl. ist ja dort noch ein Denkfehler drin?!mark332 hat geschrieben:(Wie schon gesagt, denke ich, aufgrund deines Tests, dass es auch an meiner Lazarus-Version liegen kann :/ )
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 ?
Den lese ich mit einem Multithread aus...Michl hat geschrieben:Darf ja auch keine Ausgabe mehr im Konsolefenster kommen, diese wird ja in den Pipe/Datenstrom umgeleitet.
[/quote]Michl hat geschrieben:deinen Quelltext posten, evtl. ist ja dort noch ein Denkfehler drin?!
im Grunde habe ich das ja schon, aber hier nochmal der aktuelle:
Startbutton:
Code: Alles auswählen
procedure TForm_main.Button_startMCserverClick(Sender: TObject);
begin
if javaProcessRunning then
begin
ShowMessage('Already running!');
end
else
begin
if (javaPath <> '') and (javaPath <> ' ') then
begin
BytesRead := 0;
MemStrm := TMemoryStream.Create;
javaProcess := TProcess.Create(nil);
try
javaProcess.Executable := '"'+javaPath+'"'; //kann man sich denken ;)
//if Edit_javaArgs.text <> '' then begin
// javaProcess.Parameters.Add(Edit_javaArgs.text); |Funzt noch nicht, deswegen auskommentiert ;)
//end;
javaProcess.Parameters.Add('-jar');
javaProcess.Parameters.Add('"'+serverPath+'"'); // Pfad zur .jar
javaProcess.Parameters.Add('nogui');//java soll die gui-anwendung nicht extern öffnen sondern deren Output als eigenen Output nehmen...
if not CheckBox_hideConsole.checked then begin // kann man sich auch denken ;)
javaProcess.Options := [poUsePipes];
javaProcess.ShowWindow := swoHide; //Fenster der Konsole nicht anzeigen, wenn if-fall auslöst :)
end;
javaProcess.CurrentDirectory := ExtractFileDir(serverPath);
javaProcess.Execute;
finally
Label_serverStatus.color := clYellow;
Label_serverStatus.Caption := ' Starting ';
javaProcessRunning := True;
if not CheckBox_hideConsole.checked then begin
DownloadThreadFinish := False;
testThread := DownloadThread.Create(False);
end;
end;
end
else
begin
ShowMessage('Please set your JavaPath in the Program Options!');
end;
end;
end;


Code: Alles auswählen
procedure DownloadThread.Execute;
var
BytesRead, n, i: integer;
bla: TStringList;
const
READ_BYTES = 2048;
begin
Sleep(1000);
Form_main.Memo_console.lines.add('Starting Console-Listener');
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
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
Form_main.Memo_console.Lines.add(bla[i]);
//Wenn ich hier ein Form_main.Memo_console.Lines.add('TEST'); einfüge,schreibt das Prog. erst nach schließen des java-Prozesses 'Test' in das Memo :$
bla.Free;
MemStrm.Free;
end;
end;
MfG
PS: Ich nehme keine Haftung bei Augenkrebs durch miserable Code-Formatierung ;P
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
Ok, miterstellst du den Thread, aber startest du den dann auch noch?!
Aufpassen musst du noch mit MemStrm. Entweder du machst MemStrm zur Variable von DownloadThread.Execute, dann must du MemStrm dort createn und dann auch wieder freigeben oder du nutzt MemStrm als globale Variable, darfst sie dann aber nicht in DownloadThread.Execute immer wieder frei geben (steht außerdem vor dem falschen end, wie bla.free -> musst mal ein bischen den Quellcode formatieren, dann erkennt man das besser)!
Code: Alles auswählen
testThread := DownloadThread.Create(False);
Aufpassen musst du noch mit MemStrm. Entweder du machst MemStrm zur Variable von DownloadThread.Execute, dann must du MemStrm dort createn und dann auch wieder freigeben oder du nutzt MemStrm als globale Variable, darfst sie dann aber nicht in DownloadThread.Execute immer wieder frei geben (steht außerdem vor dem falschen end, wie bla.free -> musst mal ein bischen den Quellcode formatieren, dann erkennt man das besser)!
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 ?
Der Thread muss gleich gestartet werden, weil der javaProcess ja schon läuftMichl hat geschrieben:Ok, miterstellst du den Thread, aber startest du den dann auch noch?!Code: Alles auswählen
testThread := DownloadThread.Create(False);
Aufpassen musst du noch mit MemStrm. Entweder du machst MemStrm zur Variable von DownloadThread.Execute, dann must du MemStrm dort createn und dann auch wieder freigeben oder du nutzt MemStrm als globale Variable, darfst sie dann aber nicht in DownloadThread.Execute immer wieder frei geben (steht außerdem vor dem falschen end, wie bla.free -> musst mal ein bischen den Quellcode formatieren, dann erkennt man das besser)!

Das mit MemStream mach ich mal zur variable vom DownloadThread

-------------------------------------------------------------------------------------------
MemStream ist jetzt eine lokale Variable vom Thread 'DownloadThread', wird zu beginn erstellt und dann am ende auch ("gefreet", oder wie auch immer das heißt :$)
Ändern tut sich am Ergebnis aber leider nichts :/
Zuletzt geändert von mark332 am Mo 4. Nov 2013, 22:04, insgesamt 1-mal geändert.
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
Verstehe ich nicht. In deinem Code:mark332 hat geschrieben:Der Thread muss gleich gestartet werden, weil der javaProcess ja schon läuft
Code: Alles auswählen
...
if not CheckBox_hideConsole.checked then begin
DownloadThreadFinish := False;
testThread := DownloadThread.Create(False);
end;
end;
...
Versuch mal:
Code: Alles auswählen
...
if not CheckBox_hideConsole.checked then begin
DownloadThreadFinish := False;
testThread := DownloadThread.Create(False);
testThread.Start; //hier starten!!!
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 ?
DownloadThread.Create(False) das argument 'false' sagt aus, dass der Thread sofort gestartet werden soll.Michl hat geschrieben:Verstehe ich nicht. In deinem Code:mark332 hat geschrieben:Der Thread muss gleich gestartet werden, weil der javaProcess ja schon läuftist kein Start erkennbar, wo machst du den?Code: Alles auswählen
... if not CheckBox_hideConsole.checked then begin DownloadThreadFinish := False; testThread := DownloadThread.Create(False); end; end; ...
Versuch mal:Code: Alles auswählen
... if not CheckBox_hideConsole.checked then begin DownloadThreadFinish := False; testThread := DownloadThread.Create(False); testThread.Start; //hier starten!!! end; end; ...
Das starten des javaProcess erfolg ja schon vorher im 'try'-Block

------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
Ja, mein Fehler.mark332 hat geschrieben:DownloadThread.Create(False) das argument 'false' sagt aus, dass der Thread sofort gestartet werden soll.
Ansonsten läuft der Code von dir bei mir, bis auf die oben genannten Fehler.
Setz doch mal
Code: Alles auswählen
...
while javaProcess.Running do
begin
Form_main.Memo_console.Lines.add('.');
...
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, werde ich morgen mal testen 
MfG

MfG
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
oder besser gleich: mal probieren, dadurch ist der Thread durch das javaProcess.Output.Read nicht blockiert und es müssten, solange der Prozess läuft, immer Punkte gezeichnet werden (würde ich später wieder zurückstellen, nur zum Test).
Damit weisst du, ob der Prozess läuft und keinen Output sendet oder ob in dem Aufruf des Prozesses etwas falsch ist.
Code: Alles auswählen
...
while javaProcess.Running do
begin
Form_main.Memo_console.Lines.add('.'); //Punkt zeichnen
Sleep(50);
MemStrm.SetSize(BytesRead + READ_BYTES);
if javaProcess.Output.NumBytesAvailable > 0 //Blockierung des Threads durch javaProcess.Output.Read entfernen
then n := javaProcess.Output.Read((MemStrm.Memory + BytesRead)^, READ_BYTES)
else n := 0;
if n > 0 then Inc(BytesRead, n);
...
Damit weisst du, ob der Prozess läuft und keinen Output sendet oder ob in dem Aufruf des Prozesses etwas falsch ist.
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 ?
Werde ich testen, kann ich aber leider vmtl. erst morgen, da ich für heute pc-verbot habe :$
;D
;D
------------------------------------------------------------
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 ?
Ok, habe jetzt leider eine external SIGSEGV bei
frage mich aber gerade, wo da eine Zugriffsverletzung sein soll ?!
Ich meine:
Steht gleich zu beginn des Threadcodes. :/
MfG
EDIT: Er schreibt insgesamt zwei punkte in das Memo, falls das hilft
Code: Alles auswählen
MemStrm.SetSize(BytesRead + READ_BYTES);
Ich meine:
Code: Alles auswählen
var
BytesRead, n, i: integer;
bla: TStringList;
MemStrm : TMemoryStream;
const
READ_BYTES = 2048; //<-------
begin
MemStrm := TMemoryStream.Create; //<---------
Sleep(1000);
Form_main.Memo_console.lines.add('Starting Console-Listener');
bla := TStringList.Create;
BytesRead := 0; //<---------
MfG

EDIT: Er schreibt insgesamt zwei punkte in das Memo, falls das hilft

------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Re: TProcess + Java | Parameter nicht richtig genutzt ?
keine Ahnung, wie du das schaffst?!
Bei mir läuft (habe es sogar auf deine Bezeichner angepasst):
Bei mir läuft (habe es sogar auf deine Bezeichner angepasst):
Code: Alles auswählen
procedure DownloadThread.Execute;
var
BytesRead, n, i: integer;
bla: TStringList;
MemStrm: TMemoryStream;
const
READ_BYTES = 2048;
begin
Form_main.Memo_console.lines.add('Starting Console-Listener');
bla := TStringList.Create;
MemStrm := TMemoryStream.Create;
BytesRead := 0;
while javaProcess.Running do
begin
Form_main.Memo_console.Lines.add('.');
Sleep(50);
// stellt sicher, dass wir Platz haben
MemStrm.SetSize(BytesRead + READ_BYTES);
// versuche, es zu lesen
if javaProcess.Output.NumBytesAvailable>0 then
n := javaProcess.Output.Read((MemStrm.Memory + BytesRead)^, READ_BYTES)
else
n:=0;
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
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
Form_main.Memo_console.Lines.add(bla[i]);
end;
bla.Free;
MemStrm.Free;
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 ?
Dann werde ich jetzt mal die Tasten Strg,C und V anstrengenMichl hat geschrieben:keine Ahnung, wie du das schaffst?!
Bei mir läuft (habe es sogar auf deine Bezeichner angepasst)

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