我正在尝试搜索信息,如果tcl线程可能发生进程间通信。我对这个话题很认真,所以现在只收集信息。我理解发送器和接收器机制被编码以在进程之间传递数据。而tcl thread包提供send命令。另外线程可以用作同一内部的spawn进程的计时器。 是否有可能从线程接收数据到另一个线程? 感谢你。
#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"
}
答案 0 :(得分:2)
你需要更清楚地了解你在寻找什么。线程不是进程!使用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服务等等,但这变得非常复杂!