Delphi 将倍频程和Lazarus/FreePascal与TProcess接口
我试图通过一个TProcess与Octave通信,但我似乎无法从中读取任何字节。附件是主表格的单位;一个完整的演示应用程序可以在我的帖子下面的论坛上下载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
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并且缓冲区已满,则可能导致死锁。