在TCL中跨多个线程访问文件句柄



我使用的是tcl 8.5版本。

我创建了一个Itcl类itcl::class C_LOG,在里面我定义了一些私有方法,其中一个是public method openLog {filename} {},我在里面执行文件打开/附加操作,

if { [catch {open $filename a} logFileId ] } {
    error $logFileId
}

在类之外,我创建了一个多线程程序public method userInfo,它将把userinfo env值打印到上面已经创建的文件中。

puts $logFileId $userinfo.

但我遇到一个错误can not find channel named fileXXXX

问题似乎是因为我在线程外创建了一个文件句柄,并且我试图在线程内访问该句柄,我不确定这是否真的有效,如果是,请告诉我如何在线程中携带文件句柄/通道。

实际上并没有那么难,您必须将文件描述符传输到另一个线程:

::thread::transfer $otherThread $logFileId

一旦你做到了,你只能从这个其他线程访问它
如果你想从不同的线程进行日志记录,我建议使用自己的线程并发送应该记录的数据:

set logThread [::thread::create]
thread::transfer $logThread $logFileId
# And to log something:
thread::send -async $logThread [list puts $logFileId $userinfo]

相关内容

  • 没有找到相关文章

最新更新