TCL: пока не нажата ни одна клавиша - PullRequest
1 голос
/ 07 сентября 2011

Я бы хотел запустить цикл while, пока stdin не будет заполнен символом.

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

Проблема с кодом выше в том, что он будет ждать stdin, и я не хочу, чтобы он ждал. Я хочу, чтобы код выполнялся все время.

Изменить 8 сентября 2011 г. - 8,55

Код используется внутри инструмента FPGA, который называется System Console (Altera). Это работает с командами TCL, но, к сожалению, я не знаю, что он может обрабатывать, а что нет.

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Вы должны использовать fileevent на stdin, чтобы установить функцию, вызываемую после того, как канал станет читабельным, затем используйте vwait для запуска цикла обработки событий.Ваши другие задачи могут быть запущены с использованием цепочек после, чтобы работа была выполнена по частям, не останавливая обработку событий слишком долго.

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
2 голосов
/ 08 сентября 2011

Если вы переведете канал 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 программу, чтобы сделать еще более причудливых вещей .

...