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

Für Fragen von Einsteigern und Programmieranfängern...
Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

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 :) )
Und genau diese Meldungen kannst du dir per Pipe in deinem Memo anzeigen lassen. Ist es nicht das, was du wolltest?!

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: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 :) )
Und genau diese Meldungen kannst du dir per Pipe in deinem Memo anzeigen lassen. Ist es nicht das, was du wolltest?!
Sobald ich poUsePipes anmache, gibt es die Meldungen leider weder in der Console, noch im Memo... :/
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] ?

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

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

mark332 hat geschrieben:Sobald ich poUsePipes anmache, gibt es die Meldungen leider weder in der Console, noch im Memo... :/
Darf ja auch keine Ausgabe mehr im Konsolefenster kommen, diese wird ja in den Pipe/Datenstrom umgeleitet.
mark332 hat geschrieben:(Wie schon gesagt, denke ich, aufgrund deines Tests, dass es auch an meiner Lazarus-Version liegen kann :/ )
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?!

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:Darf ja auch keine Ausgabe mehr im Konsolefenster kommen, diese wird ja in den Pipe/Datenstrom umgeleitet.
Den lese ich mit einem Multithread aus...
Michl hat geschrieben:deinen Quelltext posten, evtl. ist ja dort noch ein Denkfehler drin?!
[/quote]
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;
 
Multithread: "DownloadThread" ( ;) auch wenn hier nichts heruntergeladen wird :P )

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] ?

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

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

Ok, mit

Code: Alles auswählen

        testThread := DownloadThread.Create(False);
erstellst 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

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:Ok, mit

Code: Alles auswählen

        testThread := DownloadThread.Create(False);
erstellst 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)!
Der Thread muss gleich gestartet werden, weil der javaProcess ja schon läuft ;)

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] ?

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

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

mark332 hat geschrieben:Der Thread muss gleich gestartet werden, weil der javaProcess ja schon läuft ;)
Verstehe ich nicht. In deinem Code:

Code: Alles auswählen

...
        if not CheckBox_hideConsole.checked then begin
            DownloadThreadFinish := False;
        testThread := DownloadThread.Create(False);
        end;
      end;
...
ist kein Start erkennbar, wo machst du den?

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;  

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:Der Thread muss gleich gestartet werden, weil der javaProcess ja schon läuft ;)
Verstehe ich nicht. In deinem Code:

Code: Alles auswählen

...
        if not CheckBox_hideConsole.checked then begin
            DownloadThreadFinish := False;
        testThread := DownloadThread.Create(False);
        end;
      end;
...
ist kein Start erkennbar, wo machst du den?

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;
...
DownloadThread.Create(False) das argument 'false' sagt aus, dass der Thread sofort gestartet werden soll.
Das starten des javaProcess erfolg ja schon vorher im 'try'-Block ;)
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

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

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

mark332 hat geschrieben:DownloadThread.Create(False) das argument 'false' sagt aus, dass der Thread sofort gestartet werden soll.
Ja, mein Fehler.

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('.'); 
...
Wird der Punkt geschrieben?

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 »

Jup, werde ich morgen mal testen :)
MfG
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

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

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

oder besser gleich:

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);  
...
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

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 »

Werde ich testen, kann ich aber leider vmtl. erst morgen, da ich für heute pc-verbot habe :$

;D
------------------------------------------------------------
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 »

Ok, habe jetzt leider eine external SIGSEGV bei

Code: Alles auswählen

    MemStrm.SetSize(BytesRead + READ_BYTES); 
frage mich aber gerade, wo da eine Zugriffsverletzung sein soll ?!
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;   //<---------
Steht gleich zu beginn des Threadcodes. :/

MfG :)

EDIT: Er schreibt insgesamt zwei punkte in das Memo, falls das hilft ;)
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

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

Re: TProcess + Java | Parameter nicht richtig genutzt ?

Beitrag von Michl »

keine Ahnung, wie du das schaffst?!

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;  

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:keine Ahnung, wie du das schaffst?!

Bei mir läuft (habe es sogar auf deine Bezeichner angepasst)
Dann werde ich jetzt mal die Tasten Strg,C und V anstrengen ;)
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Antworten