2015-09-07 61 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