假的长时间运行的程序:
proc long_job {} {
puts "long_job start"
puts "- after 1s start"
after 1000
puts "- after 1s start"
after 1000
puts "- after 1s start"
after 1000
puts "- after 1s start"
after 1000
puts "- after 1s start"
after 1000
puts "- after 2s start"
after 2000
puts "long_job end"
}
long_job
实现:
namespace eval my {}
proc my_jobReader {pipe} {
if [eof $pipe] {
if [catch {close $pipe} err] {
puts $err
set my::jobError "true"
}
set my::jobDone "true"
return
}
puts [gets $pipe]
}
proc my_doJob {job} {
set my::jobDone "false"
set my::jobError "false"
set pipe [open |$job]
fileevent $pipe readable [list my_jobReader $pipe]
vwait my::jobDone
if {$my::jobError == "true"} {
return -code error
}
}
puts "general run"
catch {exec tclsh long_job.tcl} out
puts $out;
puts "general run end"
puts ""
puts ""
puts ""
puts "do my_doJob"
my_doJob {tclsh long_job.tcl}
puts "do my_doJob end"
运行:
tclsh t.tcl
可以发现,general run是运行完才打印的。
使用my_doJob可以运行同时打印。