我试图搜索信息,如果进程间通信可以与tcl线程发生。我对这个话题更感兴趣,所以现在只是收集信息。我理解发送方和接收方机制要编码,以便在进程之间传递数据。而tcl线程包提供了发送命令。线程也可以用作定时器的产卵过程中相同的。是否有可能从线程接收数据到另一个线程?感谢你。
#contains of test.tcl
puts stdout "hello from wish"
# end of file
# set cmd
set exe {wish85.exe}
set exepath [list $exe test.tcl]
# This next line is slightly magical
set f [open |$exepath r+]
# Use the next line or you'll regret it!
puts $f {fconfigure stdout -buffering line}
fileevent $f readable "getline $f"
proc getline f {
if {[gets $f line]<0} {
close $f ;
return ;
}
puts "line=$line"
}
你需要更清楚你在寻找什么。线程不是进程!使用Tcl,每个Tcl解释器上下文(在其中生成命令和变量的东西)都绑定到单个线程,每个线程都耦合到单个进程。
Tcl有一个用于管理线程的Thread包(它应该随任何合适的Tcl 8.6发行版一起发布),它提供了在线程之间发送消息的机制,thread::send
。这些消息?它们是可执行的脚本,这意味着它们真的灵活。
Tcl非常擅长运行子进程并通过管道与它们通信。例如,您可以使用
open
在几行中运行从属解释器:# This next line is slightly magical set mypipeline [open |[list [info nameofexecutable]] r+] # Use the next line or you'll regret it! puts $mypipeline {fconfigure stdout -buffering line}
它甚至可以很好地与
fileevent
命令一起工作,因此您可以在每个解释器中进行异步处理。(这在语言运行时中真的很少见,唉)Tk中的
send
命令可以让您使用相同的显示发送脚本到其他进程(我不确定这是否适用于Windows),就像thread::send
在同一进程中使用线程一样。Tcllib中的
comm
包做了类似的事情,但使用通用套接字作为通信结构。在Windows上,您可以使用Tcl中的
dde
命令与其他进程通信。我不认为Tcl在默认情况下注册DDE服务器,但这很容易做到(如果您正在运行事件循环,但这是大多数IPC机制发挥最佳作用的常见要求)。
更一般地说,你可以考虑运行web服务等,但这变得相当复杂!