-2

假设有一个包含无限循环条件的 a.tcl,例如,

while {1} {
    puts $val 
}

我想实现一个 tk 按钮,它执行一个 .tcl 文件并继续在 tk-text 窗口中运行并打印 $val 以固定的时间间隔,比如每 1 秒。此外,当我们再次单击该按钮时,它应该停止运行 a.tcl

注意:我尝试使用exec tclsh a.tcl 但由于 a.tcl 中的无限 while 循环而挂起 tk-window

4

1 回答 1

1

如果不是使用 ,而是使用exec以下命令启动子进程:

set pipeline [open |[list tclsh a.tcl]]

然后 GUI 将保持活动状态。但是,您可能希望不时从管道中读取。

proc line_per_second {pipeline} {
    puts [gets $pipeline]
    after 1000 line_per_second $pipeline
}
line_per_second $pipeline

当你close $pipeline,它应该关闭东西(因为操作系统管道被关闭)。

请注意,对于真正的代码,与只是尽可能快地一遍又一遍地喷出同一行的代码相反,您可以使用 readablefileevent来触发您的调用gets

proc read_line {pipeline} {
    gets $pipeline line
    if {[eof $pipeline]} {
        close $pipeline
    } else {
        puts $line
    }
}
fileevent $pipeline readable [list read_line $pipeline]

但是,使用您的特定脚本可能会过于频繁地触发并使事件的 GUI 有点饥饿。这只是一个非常大量输出的问题。

于 2021-02-22T18:20:29.333 回答