Tcl 是否读取事件处理程序中的所有输入?

Tcl 是否读取事件处理程序中的所有输入?,tcl,Tcl,可读文件事件是由通道变得可读,还是由通道变得可读而触发的?在文件事件处理程序中,我是否必须读取所有可用输入才能在将来触发新事件?或者我可以只读取1个字符并返回,如果有更多的输入,我的处理程序将自动直接再次调用?或者不直接,而是放在事件队列的末尾,因此这将是最好的方法(可能不仅仅是一个字符,例如一行),以防止一个流阻塞整个程序?它由可读的通道触发,因此您只能读取输入的一部分(或者偶尔不读取任何内容,确保再次调用处理程序)。但是,读取所有可用输入对性能更好(不一定是所有可用字节:如果逐行读取,则执行

可读文件事件是由通道变得可读,还是由通道变得可读而触发的?在文件事件处理程序中,我是否必须读取所有可用输入才能在将来触发新事件?或者我可以只读取1个字符并返回,如果有更多的输入,我的处理程序将自动直接再次调用?或者不直接,而是放在事件队列的末尾,因此这将是最好的方法(可能不仅仅是一个字符,例如一行),以防止一个流阻塞整个程序?

它由可读的通道触发,因此您只能读取输入的一部分(或者偶尔不读取任何内容,确保再次调用处理程序)。但是,读取所有可用输入对性能更好(不一定是所有可用字节:如果逐行读取,则执行
get
,直到fblocked条件返回
-1


输入耗尽的符号是
[fblocked$channel]的真实值
。这就是为什么使用
的用例可能会得到
和不完整的输入行:即使通道在技术上是可读的,只是不可获取,事件在新数据到达之前不会再次触发。

从技术上讲,它是通过可读触发的,但Tcl在缓冲数据可用时会伪造事件。您不必担心除非你正在编写一个频道驱动程序(大多数人都很明智,不会这么做),否则你应该仔细考虑一下差异.No,
select
本身是级别触发的:如果不排空可读文件描述符,下一个
select
将立即通知可读性。缓冲会从
select
中带走一些数据,因此作为回报,Tcl必须“伪造”如果没有缓冲,select将生成事件。但select在类似情况下也会生成事件。