每 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
脚本非常简单,因为它没有提供简单的机制来取消重复。但是,您使用的版本非常简单,可以很好地实际处理终止事件。您只需捕获错误(来自已关闭的通道)并通过 return
ing 进行响应,这会停止使用 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]
这在处理多个连接、更复杂的参数传递等方面表现更好
我正在关注关于使用 tcl 和 tk 进行实际编程的 echo 服务示例,我有一些关于基于该代码实现一些额外内容的问题(在 tcl 中)。
我试图每 30 秒向所有客户端发送一条消息。我正在使用维基 http://wiki.tcl.tk/9299 中定义的 "every" 过程,其中说 "To limit the number of repetitions, use return:[...]" 的部分。一旦用户离开服务器(通过关闭套接字),每个函数仍然运行并且我收到错误消息。我怎样才能检查套接字是否仍然打开,如果没有,我将停止发送消息?
every
脚本非常简单,因为它没有提供简单的机制来取消重复。但是,您使用的版本非常简单,可以很好地实际处理终止事件。您只需捕获错误(来自已关闭的通道)并通过 return
ing 进行响应,这会停止使用 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]
这在处理多个连接、更复杂的参数传递等方面表现更好