【问题标题】:Run TCL script in regular intervals with continuous results定期运行 TCL 脚本,结果连续
【发布时间】:2014-11-17 12:54:00
【问题描述】:

我在我的一个 TCL 脚本中遇到了问题。我需要在具有终止条件的无限循环中运行它,并且在每个循环中我都需要编写一些输出。这是我使用的基本代码:

proc wr {i} {
    puts -nonewline "$i"
}

proc do {roof} {
    set end 0
    while {$end < $roof} {
        after 1000
        wr $end
        incr end
    }
}

do 10

预期的行为是每秒都会有一个新的输出,直到 $end == $roof。但是在运行此脚本后,控制台窗口会忙碌 10 秒,然后立即打印出整个输出。

感谢您的建议:)

【问题讨论】:

    标签: while-loop tcl infinite-loop


    【解决方案1】:

    问题是你没有刷新stdout

    如果您修改脚本使其刷新stdout

    proc wr {i} {
        puts -nonewline "$i"
        flush stdout
    }
    
    proc do {roof} {
        set end 0
        while {$end < $roof} {
            after 1000
            wr $end
            incr end
        }
    }
    
    do 10
    

    它会起作用的。也可以将stdout通道的缓冲改为无,默认为line

    fconfigure stdout -buffering none
    

    如果你写多行,默认缓冲会在遇到换行时刷新标准输出,但你永远不会写换行。

    【讨论】:

    • 它在 TCL 脚本中效果很好,谢谢!但是,当我在 TK 中尝试相同的方法时 - 间隔更改标签文本 - 刷新标准输出显然不会起作用,但必须有不同的解决方法,你能帮我解决这个问题吗? :)
    • @Tomáš'GunsBlazing'Frček 嗯,我不确定这是否能解决您的问题,但我使用递归而不是循环来为gif 图片制作动画。我有我的过程来更改图像标签,我在proc 的末尾使用after $ms procname
    • 使用update或使用after 1000 [list wr $end]安排下一次执行
    • 递归运行良好,谢谢你们,伙计们:)
    • 默认情况下,stdout 在去终端时是line 缓冲的,full 在去管道或文件时是缓冲的。 (stderr 默认情况下总是无缓冲的,因为它用于写出故障转储之类的东西,如果有必要的话。你不应该在stderr 上写非诊断信息。)所有设置都可以用fconfigure 覆盖。
    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 2017-10-26
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多