我有以下代码......
lassign [ chan pipe ] chan chanW
fileevent $chan readable [ list echo $chan ]
proc echo { chan } {
...
}
proc exec { var1 var2 } {
....
puts $chanW "Some output"
....
}
现在根据man fileevent将在程序闲置时执行 是否有可能在此之前执行fileevent。例如,可以强制在事件变得可读之后立即执行fileevent,以某种方式赋予它优先级....而不使用线程:)
答案 0 :(得分:2)
Tcl从不在“意外”点执行事件处理程序;它只在要求它明确地执行此操作的点处运行它们,或者在某些配置中(例如在wish
内部)执行它时不执行任何其他操作。您可以通过两个命令引入显式的等待事件:
update
vwait
update
命令会清除当前事件队列,但不会等待传入事件(严格来说,它会执行操作系统级别的等待长度为零)。 vwait
命令也允许真正等待发生,等待写入命名的Tcl全局变量。 (它使用C级变量跟踪来执行此操作,BTW。)执行其中任何一项操作都会让您的代码在返回之前处理事件。请注意,此功能还有许多其他包装器; http包中的geturl
命令(在“同步”模式下)和Tk包中的tkwait
命令都执行此操作。
并发症?在运行事件循环时,很容易让代码重新进入自身。这很容易导致您进行大量嵌套的事件循环调用,使您无法在堆栈空间中运行;不要那样做。相反,为重入问题做准备(全局变量检查是最容易实现的方法),这样就不会嵌套事件循环。
或者,如果您使用的是Tcl 8.6,则可以切换代码以使用协同程序。它们允许您停止当前过程评估并返回主事件循环以等待未来事件再次开始执行之前:您最终得到的代码在预期时间返回,但首先暂停了一段时间。如果您想了解有关此方法的更多信息,请在此处提出另一个单独的问题。