如何在运行循环时读取Octave中的键盘输入?

时间:2015-09-08 12:31:11

标签: input octave

问题:

我正在运行一个包含无限循环的脚本,我想通过用户输入退出此循环。我不想使用标准的“输入”函数,因为它在等待用户输入时暂停循环的执行。我希望程序一直保持循环(直到给出某些键盘输入)。我不想用ctrl + c退出循环,因为程序关闭循环后的程序,不执行。

问题:

在八度音程中,当在执行脚本期间向命令窗口输入某些内容时,在脚本结束之前,命令窗口中不会显示任何内容。很明显,在执行脚本期间给出的键盘输入存储在某处(这是对的吗?)。而现在最大的猜测是在哪里?我该如何访问这些数据?

我在Win7中运行Octave 4.0.0

P.S。还欢迎其他关于停止循环的建议

2 个答案:

答案 0 :(得分:1)

使用kbhit:

while (1)
  if (kbhit (1) == 'x')
    break
  endif

  sleep (0.2)
  printf ("Loop is running...\n");
  fflush (stdout);

endwhile

或者如果你想用ctrl-c退出并最终确定你的脚本,请使用unwind_protect,unwind_ptrotect_cleanup块

unwind_protect
  while (1)
    sleep (0.2)
    printf ("Loop is running...\n");
    fflush (stdout);
  endwhile
unwind_protect_cleanup
  disp ("doing my cleanup");
end_unwind_protect

答案 1 :(得分:0)

  

在八度音程中,当在执行脚本期间向命令窗口输入某些内容时,在脚本结束之前,命令窗口中不会显示任何内容。很明显,在执行脚本期间给出的键盘输入存储在某处(这是对的吗?)。而现在最大的猜测是在哪里?我该如何访问这些数据?

这称为缓冲,是一种非常常见的行为。原理很简单。您可以将系统保留在缓冲区中,而不是在准备就绪时写入所有内容,而只有在被告知这样做时或缓冲区已满时才写入。许多磁盘操作都是这样工作的,例如,将一些小文件复制到USB记忆棒中时(取决于挂载选项)。一旦缓冲区已满,或者当您单击以弹出USB时,系统将实际执行写入。

如果您阅读Octave手册的Paging Screen Output部分,您会看到:

  

通常,在Octave准备打印顶级提示或从标准输入读取之前(例如,通过使用fscanf或scanf函数),寻呼机不会显示输出。这意味着如果您要求Octave使用单个命令语句执行大量工作,则在屏幕上出现任何输出之前可能会有一些延迟。函数fflush可用于强制输出立即发送到寻呼机(或任何其他流)。

或者,您可以使用page_output_immediately()

关闭此缓冲
  

查询或设置内部变量,该变量控制Octave是否在可用时立即将输出发送到寻呼机。

     

否则,Octave会缓冲其输出并等待,直到打印提示之前将其刷新到寻呼机。