我想运行一个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
程序来做更奇特的事情。