(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 BytesWritten<>Length(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 archive at Nabble.com. _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal