我使用的是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
似乎问题是因为我在线程外部创建了一个文件句柄,我试图在一个线程内访问相同的内容,我不确定这是否真的有用,如果有的话, 请让我知道如何将文件句柄/通道传送到线程内。
答案 0 :(得分:1)
实际上并不难,你必须将文件描述符转移到另一个线程:
::thread::transfer $otherThread $logFileId
一旦你这样做,你只能从这个其他线程访问它 如果你想从不同的线程登录,我建议使用一个自己的线程并发送它应该记录的数据:
set logThread [::thread::create]
thread::transfer $logThread $logFileId
# And to log something:
thread::send -async $logThread [list puts $logFileId $userinfo]