Octave和Lazarus / FreePascal与TProcess的接口

时间:2017-02-13 22:38:50

标签: delphi octave lazarus freepascal

I have also asked this question @ the Lazarus forums, here

我试图通过TProcess与Octave通信,但我似乎无法从中读取任何字节。附件是主要形式的单位;在我的帖子下,论坛上有一个完整的演示应用程序。

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Process;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  POctave: TProcess;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (not POctave.Running) then
  begin
    POctave.Executable := 'C:\Octave\Octave-4.2.0\bin\octave-cli.exe';
    POctave.Parameters.Add('--no-gui');
    POctave.Options := [poUsePipes];
    WriteLn('-- Executing octave --');
    POctave.Execute;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  command: string;
  Buffer: string;
  BytesAvailable: DWord;
  BytesRead: longint;
  NoMoreOutput: boolean;
begin
  command := 'pwd' + #10;
  if (POctave.Running) then
    POctave.Input.Write(command, Length(command));

  if (POctave.Running) then
  begin
    BytesAvailable := POctave.Output.NumBytesAvailable;
    BytesRead := 0;
    while BytesAvailable > 0 do
    begin
      SetLength(Buffer, BytesAvailable);
      BytesRead := POctave.OutPut.Read(Buffer[1], BytesAvailable);
      WriteLn(Buffer);
      BytesAvailable := POctave.Output.NumBytesAvailable;
      NoMoreOutput := False;
    end;
  end;
end;

initialization
  POctave := TProcess.Create(nil);

finalization
  POctave.Free;

end.

我添加了睡眠例程,并将'pwd'命令的返回更改为#1310,两者均未成功。

    procedure TForm1.Button2Click(Sender: TObject);
var
  command: ansistring;
  Buffer: string;
  BytesAvailable: DWord;
  BytesRead: longint;
  NoMoreOutput: boolean;
begin
  command := 'pwd'#13#10;
  if (POctave.Running) then
    POctave.Input.Write(command, Length(command));
  Sleep(100);

  if (POctave.Running) then
begin
    Sleep(100);
    BytesAvailable := POctave.Output.NumBytesAvailable;
    BytesRead := 0;
    while BytesAvailable > 0 do
    begin
      Sleep(100);
      SetLength(Buffer, BytesAvailable);
      BytesRead := POctave.OutPut.Read(Buffer[1], BytesAvailable);
      WriteLn(Buffer);
      BytesAvailable := POctave.Output.NumBytesAvailable;
      NoMoreOutput := False;
    end;
  end;
end;   

1 个答案:

答案 0 :(得分:1)

问题是我在说这句话:

POctave.Input.Write(command, Length(command));

而不是:

POctave.Input.Write(command[1], Length(command));

更改后(并添加延迟!等待结果绝对至关重要,但我的错误更为根本。)

请记住:Pascal字符串不是C字符串。糟糕...

有效!现在我可以向Octave发送命令并通过管道检索结果。 :)