großen Programm-Output in Echtzeit in TMemo übertragen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
LazarusUser
Beiträge: 4
Registriert: Mo 21. Mai 2012, 16:49

großen Programm-Output in Echtzeit in TMemo übertragen

Beitrag von LazarusUser »

Hallo zusammen!

Ich habe erst vor kurzem angefangen mich mit Lazarus zu beschäftigen :D.
Die Sprache gefällt mir sehr gut, vor allem aber die Plattformunabhänigkeit!

Ich habe auch direkt eine Frage:
Ich habe einen Minecraft-Server (als jar) und starte diese über TProcess. Dabei habe ich die Option poUsePipes verwendet, um den Output zu lesen.
Jetzt soll aber in Echzeit, da der Server sehr lange läuft, der Output in ein TMemo-Feld übertragen werden.

Mein Code sieht in etwa so aus:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  Process: TProcess;
begin
  Process := TProcess.Create(nil);
  Process.CommandLine := 'java -Xmx1024M -Xms1024M ' + OpenDialog1.FileName + ' nogui';
  Process.Options := [poUsePipes];
 
  Process.Execute;
 
  while Process.Running do
  Memo1.Lines.LoadFromStream(Process.Output);
end;
Das ganze geht leider nicht auf, denn so wird gar kein Output übertragen.

Wenn ich allerdings dieses hier mache:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  Process: TProcess;
begin
  Process := TProcess.Create(nil);
  Process.CommandLine := 'java -Xmx1024M -Xms1024M ' + OpenDialog1.FileName + ' nogui';
  Process.Options := [poUsePipes, poWaitOnExit];
 
  Process.Execute;
 
  Memo1.Lines.LoadFromStream(Process.Output);
end;
wird der Output erst übertragen, wenn das Programm zu Ende ist :(.

Kann mir da jemand helfen?
Ich habe leider hier im Board und bei Google noch nichts gefunden.

-LazarusUser

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

Re: großen Programm-Output in Echtzeit in TMemo übertragen

Beitrag von creed steiger »

http://wiki.freepascal.org/Executing_Ex ... rge_output" onclick="window.open(this.href);return false;

LazarusUser
Beiträge: 4
Registriert: Mo 21. Mai 2012, 16:49

Re: großen Programm-Output in Echtzeit in TMemo übertragen

Beitrag von LazarusUser »

@creed steiger:
Das Programmbeipiel habe ich schon gesehen, aber
  • es ist keine grafische Anwenung -> kein TMemo
  • es überträgt den Stream nicht in Echtzeit
Aber trotzdem danke!

-LazarusUser

ws7
Beiträge: 18
Registriert: Mi 20. Jul 2011, 22:27

Re: großen Programm-Output in Echtzeit in TMemo übertragen

Beitrag von ws7 »

http://www.lazarusforum.de/viewtopic.ph ... 513#p51136
Und dort das letzte Beispiel.
Statt des Zwischenspeicherns in den TMemoryStream kannst du natürlich auch gleich in dein TMemo ausgeben.

LazarusUser
Beiträge: 4
Registriert: Mo 21. Mai 2012, 16:49

Re: großen Programm-Output in Echtzeit in TMemo übertragen

Beitrag von LazarusUser »

@ws7:
Danke für deinen Post :D!

Allerdings bekomme ich die TMemoryStreams nicht in den TMemo übertragen.

Ich benutze dazu Memo1.Lines.LoadFromStream(ms_std) und Memo1.Lines.LoadFromStream(ms_err).

Leider bekomme ich bei Komplimieren folgenden Error:

Code: Alles auswählen

Unit1.pas(79,13) Error: Identifier not found "strListStd"
Unit1.pas(80,13) Error: Identifier not found "strListErr"
Unit1.pas(81,13) Error: Identifier not found "strListStd"
Unit1.pas(82,13) Error: Identifier not found "strListErr"
Woran kann das liegen?

Trotzdem vielen Dank für deine Mühe!

-LazarusUser

LazarusUser
Beiträge: 4
Registriert: Mo 21. Mai 2012, 16:49

Re: großen Programm-Output in Echtzeit in TMemo übertragen

Beitrag von LazarusUser »

@ws7:
Leider funktioniert dein Code irgendwie nicht :(.
Der Output wird gar nicht und erst recht nicht in Echtzeit übertragen :o.

-LazarusUser

Antworten