Если вы хотите выполнить команду в фоновом режиме в Tcl, вы можете перейти к следующему:
proc cb { fd } {
gets $fd buf
append ::output $buf
if {[eof $fd]} {
close $fd
set ::finished 1
}
}
set command "<command to execute>"
set ::output ""
set ::finished 0
set fd [open "|$command" r]
fconfigure $fd -blocking no
fileevent $fd readable "cb $fd"
vwait ::finished
puts $::output
Использование open
с |
перед командойпозволит вам «открыть» трубу для команды.Использование fconfigure
для установки неблокирования позволит вам читать с него, не блокируя другие процессы в скрипте.fileevent
будет вызывать указанный метод обратного вызова (в данном случае cb
) всякий раз, когда есть данные для чтения (таким образом, флаг readable
).vwait
будет следить за тем, чтобы сценарий не продолжался до тех пор, пока не будет записана указанная переменная, поэтому $command
будет выполняться в фоновом режиме, что позволит интерфейсу Tk оставаться отзывчивым и ждать, пока вы не захотите продолжить.