我使用的是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]