0

我正在通过 fileevent 调用 proc。该过程返回一行 od 数据。如何接收这些数据?我编写的以下代码用于在数据可用时从管道接收数据。我不想通过使用直接获取来阻止。

proc GetData1 { chan } {
    if {[gets $chan line] >= 0} {
        return $line
    }
}

proc ReadIO {chan {timeout 2000} } {
    set x 0
    after $timeout {set x 1}
    fconfigure $chan -blocking 0  

    fileevent $chan readable [ list GetData1 $chan ] 
    after cancel set x 3
    vwait x
    # Do something based on how the vwait finished...
    switch $x {
       1 { puts "Time out" }
       2 { puts "Got Data" }
       3 { puts "App Cancel" }
       default { puts "Time out2  x=$x" }
    }
    # How to return data from here which is returned from GetData1
}

ReadIO $io 5000

# ** How to get data here which is returned from GetData1 ? **
4

1 回答 1

1

这样做的方法可能与 Tcl 程序员一样多。本质上,您不应该使用 return 从您的 fileevent 处理程序传回数据,因为它不是call以通常的方式编辑的,因此您可以获得它返回的内容。

这里有一些可能的方法。

免责声明这些都没有经过测试,而且我很容易出现打字错误,所以请小心对待!

1)让您的文件事件处理程序写入全局验证:

proc GetData1 {chan} {
    if {[gets $chan line]} >= 0} {
        append ::globalLine $line \n
    }
}

.
.
.

ReadIO $io 5000

# ** The input line is in globalLine in the global namespace **

2)将全局变量的名称传递给您的文件事件处理程序,并将数据保存在那里

proc GetData2 {chan varByName} {
    if {[gets $chan line]} >= 0} {
        upvar #0 $varByName var
        append var $line \n
    }
}

fileevent $chan readable [list GetData1 $chan inputFromChan]

.
.
.

ReadIO $chan 5000

# ** The input line is in ::inputFromChan **

这里变量的一个不错的选择可能是一个由 $chan 索引的数组,例如fileevent $chan readable [list GetDetail input($chan)]

3)定义某种类来管理您的通道,这些通道在内部存储数据并有一个成员函数来返回它

oo::class create fileeventHandler {
    variable m_buffer m_chan

    constructor {chan} {
        set m_chan $chan
        fileevent $m_chan readable [list [self object] handle]
        set m_buffer {}
    }

    method data {} {
        return $m_buffer
    }

    method handle {} {
        if {[gets $m_chan line]} >= 0 {
            append m_buffer $line \n
        }
    }
}

.
.
.

set handlers($chan) [fileeventHandler new $chan];  # Save object address for later use

ReadIO $io 5000

# Access the input via [handlers($chan) data]
于 2013-06-21T08:30:29.560 回答