@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 ビルドが必要です (これは現在、すべてのプラットフォームのデフォルトですが、Unix での古いバージョンの Tcl esp はデフォルトでスレッド化された Tcl をビルドしません)。Thread
パッケージ (デフォルトで含まれています)。スレッドで使用する方法は次のとおりです。
thread::create "[list exec cmd /c start /wait cmd /c make all-all];[list thread::send [thread::id] {callback code}];thread::exit"
これを定期的に呼び出す必要がある場合は、ジョブごとに新しいワーカー スレッドを作成するのではなく、ワーカー スレッドを 1 つだけ使用する価値があります。
編集: /wait
start のパラメーターとして追加して、最初の cmd を実行し続けます。
cmd /c start /wait cmd /c make all-all