问题:
我正在运行一个包含无限循环的脚本,我想通过用户输入退出此循环。我不想使用标准的“输入”函数,因为它在等待用户输入时暂停循环的执行。我希望程序一直保持循环(直到给出某些键盘输入)。我不想用ctrl + c退出循环,因为程序关闭循环后的程序,不执行。
问题:
在八度音程中,当在执行脚本期间向命令窗口输入某些内容时,在脚本结束之前,命令窗口中不会显示任何内容。很明显,在执行脚本期间给出的键盘输入存储在某处(这是对的吗?)。而现在最大的猜测是在哪里?我该如何访问这些数据?
我在Win7中运行Octave 4.0.0
P.S。还欢迎其他关于停止循环的建议
答案 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会缓冲其输出并等待,直到打印提示之前将其刷新到寻呼机。