我希望运行while
循环,直到stdin
填充一个字符。
puts "Press x + <enter> to stop."
while {[gets stdin] != "x"} {
puts "lalal"
}
上面代码的问题是它会等待stdin
,我不希望它等待。我希望代码能够一直执行。
该代码用于名为System Console(Altera)的FPGA工具中。这适用于TCL命令,但遗憾的是我不知道它可以处理哪个,哪个不能处理。
答案 0 :(得分:3)
您应该在stdin上使用fileevent设置一个通道变为可读时要调用的函数,然后使用vwait运行事件循环。您可以使用after chain启动其他任务,以便在不停止事件处理的情况下完成工作。
proc do_work {args} {...}
proc onRead {chan} {
set data [read $chan]
if {[eof $chan]} {
fileevent $chan readable {}
set ::forever eof
}
... do something with the data ...
}
after idle [list do_work $arg1]
fconfigure stdin -blocking 0 -buffering line
fileevent stdin readable [list onRead stdin]
vwait forever
答案 1 :(得分:2)
如果您将stdin
频道置于非阻止模式,gets stdin
将返回空字符串(fblocked stdin
将返回1
)输入不可用,而不是等待某事发生。
# Enable magic mode!
fconfigure stdin -blocking 0
puts "Press x + <enter> to stop."
while {[gets stdin] != "x"} {
puts "lalal"
after 20; # Slow the loop down!
}
# Set it back to normal
fconfigure stdin -blocking 1
事实上,您也可以使用系统stty
程序执行even more fancy things。