Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2009-04

Executing external process that executes another one

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

leledumbo

(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;
View this message in context: http://www.nabble.com/Executing-external-process-that-executes-another-one-tp23020765p23020765.html Sent from the Free Pascal - General mailing list .