Tcl 在 proc 返回中挂起

Tcl hang in proc return

提问人:JoshTitle 提问时间:1/3/2023 最后编辑:JoshTitle 更新时间:1/4/2023 访问量:93

问:

我写了 2 个脚本来做 somting,如下所示:

#script1,转储信息:

proc script1 {} {
  puts $file "set a 123"
  puts $file "set b 456"
  .....
}

(我转储的文件大小是 8GB)

#And 使用 script2 来获取它并执行数据类别:

while { [get $file_wrtie_out_by_script1 line] != -1 } {
  eval $line
}
close $file_wrtie_out_by_script1
Do the job....
return

在这种情况下,脚本挂起作为回报,如何解决问题...卡住了 3+ 天,thnaks

更新:

感谢 Colin,现在我使用 source 而不是 eval,但即使删除了“Do the work...”,只需保持返回,仍然挂起

TCL EVAL 冻结 处理程序

评论

1赞 Colin Macleod 1/3/2023
在 script2 中,为什么要逐行读取文件?为什么不直接做呢?evalsource $file_from_script1
0赞 Colin Macleod 1/3/2023
你是 script1 完成后运行 script2 还是同时运行?
0赞 JoshTitle 1/4/2023
嗨,我使用 eval 只是因为文件太大而无法获取,(文件大小为 13GB),使用源时,它显示tcl_setobjlength:请求负长度
0赞 JoshTitle 1/4/2023
我在 script1 完成后运行 script2
0赞 Colin Macleod 1/4/2023
我认为最新的 Tcl 版本应该能够处理该大小的文件。您使用的是哪个 Tcl 版本?source

答:

3赞 Chris Heithoff 1/4/2023 #1

该命令将返回它刚刚从文件通道读取的行中的字符数。gets

当文件的所有行都被读取后,将返回 -1。gets

你的问题是你有一个永无止境的while循环。当返回 1 时,您的 while 循环将终止。您需要将条件更改为 -1 才能终止 while 循环。gets

我同意 Colin 的评论,即您应该只使用而不是每行。如果您有多行命令,则逐行使用 eval 将失败(但在您的示例中可能不是这种情况)。sourceeval

评论

0赞 JoshTitle 1/4/2023
对于错别字,我使用 -1 而不是 1..
0赞 JoshTitle 1/4/2023
你能详细解释一下吗?-->如果您有多行命令,则逐行使用 eval 将失败
0赞 JoshTitle 1/4/2023
在文件中,我转储了很多设置命令,并使用 eval 进行设置
1赞 Donal Fellows 1/5/2023
如果你想要一个位一个 ,用于确定何时有一个块要输入......sourceinfo completeeval