gyn

Win32下的Perl,无用的select,停滞的Tk,结束吧....

使用TclTk重新编写录制程序的几个细节

  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

}


posted on 2008-10-16 09:11 gyn_tadao 阅读(461) 评论(0)  编辑 收藏 引用 所属分类: TclTk

只有注册用户登录后才能发表评论。
<2006年12月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(15)

随笔分类(126)

随笔档案(108)

相册

搜索

最新评论

阅读排行榜

评论排行榜