每 30 秒 tcl ping 消息

tcl ping message every 30 seconds

我正在关注关于使用 tcl 和 tk 进行实际编程的 echo 服务示例,我有一些关于基于该代码实现一些额外内容的问题(在 tcl 中)。

我试图每 30 秒向所有客户端发送一条消息。我正在使用维基 http://wiki.tcl.tk/9299 中定义的 "every" 过程,其中说 "To limit the number of repetitions, use return:[...]" 的部分。一旦用户离开服务器(通过关闭套接字),每个函数仍然运行并且我收到错误消息。我怎样才能检查套接字是否仍然打开,如果没有,我将停止发送消息?

every 脚本非常简单,因为它没有提供简单的机制来取消重复。但是,您使用的版本非常简单,可以很好地实际处理终止事件。您只需捕获错误(来自已关闭的通道)并通过 returning 进行响应,这会停止使用 after

proc every {ms body} {
    eval $body
    after $ms [info level 0]
}
every 30000 {
    if {[catch {
        puts $::channel "Hi there!"
    }]} return
}

最好使用辅助程序和 技术上 使用 list 生成的回调来执行此操作,这使得事情触及 Tcl 的一些更高级的功能:

proc every {ms body} {
    eval $body
    after $ms [info level 0]
}
proc sendThePing {channel} {
    if {[catch {
        puts $channel "Hi there!"
    }]} {
        # Make the _caller_ (every) return!
        return -level 2 done
    }
}

every 30000 [list sendThePing $theChannel]

这在处理多个连接、更复杂的参数传递等方面表现更好