TCL:虽然没有键按下循环

时间:2011-09-07 12:24:59

标签: while-loop tcl stdin exit break

我希望运行while循环,直到stdin填充一个字符。

puts "Press x + <enter> to stop."
while {[gets stdin] != "x"} {
   puts "lalal"
}

上面代码的问题是它会等待stdin,我不希望它等待。我希望代码能够一直执行。

编辑2011年9月8日 - 上午8:55

该代码用于名为System Console(Altera)的FPGA工具中。这适用于TCL命令,但遗憾的是我不知道它可以处理哪个,哪个不能处理。

2 个答案:

答案 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