用
TclTk
重写了视频录制程序,其中有些细节不便在前一篇《
Perl
程序转换为
Tcl/Tk
实例一则》中细述,因为它主要是讲用两种语言来实现的差别。另外,后来我又对程序做了一些修改,所以不得不再费力写下来了。
首先对于在
Tk
中使用到的命令,因为循环的关系,我们不需要将它放置在
Tk
界面代码之前。但是如果在循环之外使用,那么就只能在用到什么之前,就定义什么。这是一个细节,还是要注意一下,免得调试的时候手忙脚乱。
最主要提到的有两方面,其一是关于如何正确关闭管道。如果只是简单地
close
掉管道,除非子进程会自动关闭,不然可能一直运行下去。比如:
catch {open "|ping 127.0.0.1 -t"} output
close $output
(使用
catch
来捕捉错误,阻止烦人的错误提示)
打开任务管理器,你会看见
ping
进程依然在执行,因此这并没有达到彻底关闭的效果,这在
Perl
里也是一样的。需要显示地将进程关闭掉,我们可以使用一下的命令:
catch {exec taskkill /F /PID [pid $pipe]}
在这里,调用了系统命令
taskkill
来关闭进程,
pid
的作用是返回一个管道子进程的
pid
值,如果没有该进程将返回一个错误,并被外围的
catch
捕获。
另外的一个是关于如何输出的问题,我们使用
gets $pipe line
来得到管道的输出,之后通过一定的过滤,最终显示到
Text
上,我用两种结尾的输出试验了一下。用“
\r
”的时候,
cpu
使用率一度达到
100%
,最终程序僵死,甚至连子进程都无法正常退出。用“
\n
”则恢复正常了,
cpu
使用率很低,亦不会出现阻塞。另外,为了不输出空行,做了一些必要的检测:
set line [string trim $line]
if [string compare $line {}] {
$log insert end [string trim $line]\n
$log see end
}