`

tcl 中的exec运行第三方,怎么同时打印第三方信息到stdout 。版本2

 
阅读更多

假的长时间运行的程序:

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可以运行同时打印。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics