Delphi 将倍频程和Lazarus/FreePascal与TProcess接口

Delphi 将倍频程和Lazarus/FreePascal与TProcess接口,delphi,octave,lazarus,freepascal,Delphi,Octave,Lazarus,Freepascal,我试图通过一个TProcess与Octave通信,但我似乎无法从中读取任何字节。附件是主表格的单位;一个完整的演示应用程序可以在我的帖子下面的论坛上下载 unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Process; type { TForm1 } TForm1 = class

我试图通过一个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;   

问题是我打了这个电话:

POctave.Input.Write(command, Length(command));
与此相反:

POctave.Input.Write(command[1], Length(command));
更改此项并添加延迟后!等待结果是绝对关键的,但我的错误更为根本

记住:Pascal字符串不是C字符串。哎呀


成功了!现在,我可以向倍频程发送命令,并通过管道检索结果:

当没有字节可用且倍频程不是最快的程序时,您会立即中止。不幸的是,我也尝试将睡眠添加到例程中,以允许延迟,但没有成功。您能运行“倍频程-eval 1+1”吗?POctave.Parameters.Add'-eval';参数。添加'1+1';顺便说一句:你真正想归档什么?通过管道控制倍频程?不要使用睡眠。。。。相反,将poWaitOnExit添加到TProcess的选项中,我实际上要将一些相当大的矩阵从倍频程中去掉;如果我使用poWaitOnExit并且缓冲区已满,则可能导致死锁。