Tcl 在过程完成之前执行的Fileevent

Tcl 在过程完成之前执行的Fileevent,tcl,Tcl,我有以下代码 lassign [ chan pipe ] chan chanW fileevent $chan readable [ list echo $chan ] proc echo { chan } { ... } proc exec { var1 var2 } { .... puts $chanW "Some output" .... } 现在根据man文件,当程序空闲时将执行事件 在此之前是否可以执行fileevent。例如,有没有可

我有以下代码

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,以某种方式赋予它优先级。。。。如果不使用线程:)

Tcl从不在“意外”点执行事件处理程序;它只在被要求显式执行这些操作的点上运行它们,或者在某些配置中(例如在
wish
)它不执行其他操作时运行它们。您可以通过两个命令引入显式等待事件:

  • 更新

  • vwait

update
命令清除当前事件队列,但不等待传入事件(严格来说,它执行长度为零的操作系统级等待)。
vwait
命令还将允许真正的等待,等待一个命名的Tcl全局变量被写入。(顺便说一句,它使用一个C级变量跟踪来完成这项工作。)执行其中任何一项都可以让代码在返回之前处理事件。请注意,围绕此功能还有许多其他包装器;http包中的
geturl
命令(在“同步”模式下)和Tk包中的
tkwait
命令都可以执行此操作

并发症?在运行事件循环时,很容易让代码意外地重新进入自身。这很容易导致您进行大量嵌套事件循环调用,耗尽堆栈空间;不要那样做。相反,要为可重入性问题做好准备(最简单的方法之一是全局变量检查),这样就不会嵌套事件循环


或者,如果您使用的是Tcl 8.6,您可以切换代码以使用协同路由。它们允许您停止当前过程的计算并返回到主事件循环,以便在再次开始执行之前等待将来的事件:您最终得到的代码在预期的时间返回,但先暂停了一段时间。如果您想了解有关此方法的更多信息,请在此处提出另一个问题。

Tcl从不在“意外”点执行事件处理程序;它只在被要求显式执行这些操作的点上运行它们,或者在某些配置中(例如在
wish
)它不执行其他操作时运行它们。您可以通过两个命令引入显式等待事件:

  • 更新

  • vwait

update
命令清除当前事件队列,但不等待传入事件(严格来说,它执行长度为零的操作系统级等待)。
vwait
命令还将允许真正的等待,等待一个命名的Tcl全局变量被写入。(顺便说一句,它使用一个C级变量跟踪来完成这项工作。)执行其中任何一项都可以让代码在返回之前处理事件。请注意,围绕此功能还有许多其他包装器;http包中的
geturl
命令(在“同步”模式下)和Tk包中的
tkwait
命令都可以执行此操作

并发症?在运行事件循环时,很容易让代码意外地重新进入自身。这很容易导致您进行大量嵌套事件循环调用,耗尽堆栈空间;不要那样做。相反,要为可重入性问题做好准备(最简单的方法之一是全局变量检查),这样就不会嵌套事件循环


或者,如果您使用的是Tcl 8.6,您可以切换代码以使用协同路由。它们允许您停止当前过程的计算并返回到主事件循环,以便在再次开始执行之前等待将来的事件:您最终得到的代码在预期的时间返回,但先暂停了一段时间。如果您想了解有关此方法的更多信息,请在此处提出另一个问题。

听起来您希望异步机制同步执行。这是可以做到的,但你确定这就是你所需要的吗?是的,学习tcl,所以我只是尝试不同的东西,找到了一种方法,在puts之后加上“更新”,有更好的方法吗?另一种同步方法是通过
vwait
。我在想,也许你有一个问题需要更好的解决,但如果你正在试验,就去缪斯引导你的地方,祝你好运。(不过,也许您不应该用自己的过程来破坏内置的命令
exec
。)听起来您需要一个异步机制来同步执行。这是可以做到的,但你确定这就是你所需要的吗?是的,学习tcl,所以我只是尝试不同的东西,找到了一种方法,在puts之后加上“更新”,有更好的方法吗?另一种同步方法是通过
vwait
。我在想,也许你有一个问题需要更好的解决,但如果你正在试验,就去缪斯引导你的地方,祝你好运。(不过,也许您不应该用自己的过程来破坏内置命令
exec
。)