TCL:当没有按下键时循环



我想运行一个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命令,但不幸的是,我不知道它可以处理哪些,哪些不能处理。

您应该在stdin上使用fileevent来设置一个函数,一旦通道变得可读就调用该函数,然后使用vwait来运行事件循环。您可以使用after链启动其他任务,以便在不长时间停止事件处理的情况下完成工作。

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

如果您将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程序来做更奇特的事情。

相关内容

  • 没有找到相关文章

最新更新