2015-09-07 29 views
0

我正在尝试搜索信息,如果进程间通信可能发生在tcl线程中。我现在正在收集这方面的资料。我了解发送者和接收者机制被编码为在进程之间传递数据。而tcl线程包提供了发送命令。同样的,线程也可以用作spawn进程的定时器。 是否有可能从线程接收数据到另一个线程? 感谢你。如何使用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" 
} 

回答

2

你需要更清楚地了解你在找什么。线程不是进程!使用Tcl,每个Tcl解释器上下文(您制作命令和变量的内容)都绑定到单个线程,并且每个线程都耦合到单个进程。

Tcl有一个用于管理线程的线程包(它应该随任何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命令效果很好,所以你可以在每个解释器中做异步处理。 (这是真正的语言运行时相当罕见的,唉。)

  • 传统知识中的send命令让您发送脚本使用相同的显示(我不知道这是否适用于Windows)高达thread::send不与其他进程线程在同一个进程中。

  • Tcllib中的comm包做了一些非常相似的事情,但是使用通用套接字作为通信结构。

  • 在Windows上,你可以在Tcl中使用dde命令与其他进程进行通信。我不认为Tcl在默认情况下注册了DDE服务器,但它很容易实现(假设您正在运行事件循环,但这是大多数IPC机制的最佳工作环境)。

更一般地说,你可以考虑运行webservices等等,但这变得相当复杂!

+0

谢谢......我更现在明白。一旦我准备好了,就会放在这里。 – OliveOne

+0

如果执行exe没有stdout通道会怎么样? – OliveOne