TCL:Windows中线程之间的双向通信

Posted

技术标签:

【中文标题】TCL:Windows中线程之间的双向通信【英文标题】:TCL: Two way communication between threads in Windows 【发布时间】:2008-11-06 01:44:20 【问题描述】:

我需要在 Tcl 中的线程之间进行两种方式的通信,而我所能得到的只是一种方式,其中参数作为我唯一的 master->helper 通信通道传入。这是我所拥有的:

proc ExecProgram  command  
    if  [catch open "| $command" RDWR fd ]  
        #
        # Failed, return error indication
        #
        error "$fd"
    

调用tclsh83,例如ExecProgram "tclsh83 testCases.tcl TestCase_01"

在 testCases.tcl 文件中,我可以使用传入的信息。例如:

set myTestCase [lindex $argv 0] 

在 testCases.tcl 中我可以输出到管道:

puts "$myTestCase"
flush stdout

并通过使用进程 ID 在主线程中接收放入:

gets $app line

...在一个循环中。

这不是很好。而不是双向的。

有谁知道 Windows 中 2 个线程之间 tcl 的简单 2 路通信方法?

【问题讨论】:

【参考方案1】:

这是一个小例子,展示了两个进程如何通信。首先关闭子进程(另存为child.tcl):

gets stdin line
puts [string toupper $line]

然后是启动子进程并与之通信的父进程:

set fd [open "| tclsh child.tcl" r+]

puts $fd "This is a test"
flush $fd

gets $fd line
puts $line

父进程使用open返回的值向子进程发送数据或从子进程接收数据;要打开的 r+ 参数会打开读取和写入的管道。

由于管道上的缓冲,需要刷新;可以使用 fconfigure 命令将其更改为行缓冲。

还有一点;查看您的代码,您在这里没有使用线程,您正在启动一个子进程。 Tcl 有一个线程扩展,它允许正确的线程间通信。

【讨论】:

以上是关于TCL:Windows中线程之间的双向通信的主要内容,如果未能解决你的问题,请参考以下文章

c#命名管道双向通信

使用 Websocket 的两个设备之间的双向通信

如何在不同进程中建立Activity和Service之间的双向通信?

在 C 中使用管道在父子之间创建双向通信

R和Python之间的双向通信

swift项目中swift和objective-C之间的双向通信