(If somebody ever reads the same post in Lazarus forum, please re-read this one since there are some differences)
I'm making another GUI for Octave (a MATLAB like programming language and environment) because the currently available ones are either buggy, memory consuming, or slow (or combination of them).
I'm using TProcess to communicate with Octave with these options:
// enable communication through pipe,
// avoid console box
Options:=[poUsePipes,poNoConsole];The problems are:
1. Octave's plotting capability is done by another program (GNU Plot) called by Octave. Using above approach, no GNU plot window ever appears though the Octave process remains responsive. What should be done to solve it? Well, I could parse the command and if it deals with plotting I'll start another process that calls GNU Plot. But I assume that this is too messy and effort duplicating (because Octave already does this beautifully).
2. When an error occurs, the process dies after giving its error message (the message is printed). I'm sure of it because both Active and Running property is false. The app uses the same handler for stdout and stderr. The code:
procedure TMainForm.OctavePromptInput(ACmdBox: TCmdBox; Input: String);
var
BytesWritten: LongInt;
begin
if (Input='quit') or (Input='exit') then Close;
{ Cmdbox trims new line, so we need to add it manually before passing
input to
Octave process }
Input:=Input+#10;
BytesWritten:=OctaveProcess.Input.Write(Input[1],Length(Input));
// It happens when after the process dies because of error
if BytesWrittenLength(Input) then ShowMessage('Why is this happening
(T_T) ?');
StartPrompt;
end;
procedure TMainForm.ReadOutputIdleTimerTimer(Sender: TObject);
procedure ProcessStream(Stream: TInputPipeStream);
var
Buffer: String;
BytesRead: Integer;
BytesAvailable: LongWord;
begin
with Stream do begin
BytesAvailable:=NumBytesAvailable;
BytesRead:=0;
while BytesAvailable>0 do begin
SetLength(Buffer,BytesAvailable);
BytesRead:=Read(Buffer[1],BytesAvailable);
OctavePrompt.Write(Copy(Buffer,1,BytesRead));
BytesAvailable:=NumBytesAvailable;
end;
end;
end;
begin
// Separate StdOut and StdErr handler, so each can have its own color set
ProcessStream(OctaveProcess.Output);
OctavePrompt.TextColors(clRed,clWhite);
// If NumBytesAvailable>0 the process sends message and dies
ProcessStream(OctaveProcess.StdErr);
OctavePrompt.TextColors(clBlue,clWhite);
end;