正如@glenn-jackman 指出的那样,首选使用 fileevent (因为它应该在任何地方都可以使用)。
proc handle_bgexec {callback chan} {
append ::bgexec_data($chan) [read $chan]
if {[eof $chan]} {
# end of file, call the callback
{*}$callback $::bgexec_data($chan)
unset ::bgexec_data($chan)
}
}
proc bgexec {callback args} {
set chan [open "| $args" r]
fconfigure $chan -blocking false
fileevent $chan readable [list handle_bgexec $callback $chan]
return
}
调用它作为bgexec job_done cmd /c start /wait cmd /c make all-all
. job_done
完成后使用命令的输出调用。
也可以为这些事情使用线程,但这需要一个线程化的 tcl 构建(现在这是所有平台 AFAIK 的默认设置,但旧版本的 Tcl 尤其是 unix 下默认不构建一个线程化的 Tcl。)和Thread
包(默认包含)。将它与线程一起使用的方法是:
thread::create "[list exec cmd /c start /wait cmd /c make all-all];[list thread::send [thread::id] {callback code}];thread::exit"
如果您需要定期调用它,可能值得只使用一个工作线程而不是为每个作业创建一个新线程。
编辑:添加/wait
作为启动参数以保持第一个 cmd 运行。
cmd /c start /wait cmd /c make all-all