如何打破tcl

时间:2016-09-07 05:47:27

标签: tcl tk

当主作业运行时,需要在一段时间内运行一段代码。 基本上一些工具正在编写一个logFile,在logfile编写过程中我用grep来表示来自该logFile的错误/警告。

我使用每个循环来检查正在运行的作业的条件,然后编写一个错误/警告数据库,如果作业没有运行,它将打印消息。 问题:一旦发现作业正在运行,每个循环都会被激活,即使其他条件都是假的,它也永远不会停止。

我在if循环中使用了break,但是没有用。 如何停止每个循环,请建议。

proc every {ms body} {
     eval $body
     after $ms [info level 0]
}

proc run_this_loop {} {
    catch {set job_name [exec qstat | awk {{print $3}} | grep liberate]} error
    if {[string match *abnormally* $error]} {
        puts "No background liberate job is found\n"
    } else {
        every 10000 {grepLoop}
    }
}

every 1000 {run_this_loop}

2 个答案:

答案 0 :(得分:2)

一种简单的方法是保存after调用的id并使用它来取消:

proc every {ms body} {
    global id
    eval $body
    set id [after $ms [info level 0]]
}

every 2000 {puts foo}

after cancel $id

文档: afterevalglobalinfoprocputsset

答案 1 :(得分:0)

我意识到了我的看涨代码。

 proc run_this_loop {} {
   catch {set job_name [exec qstat | awk {{print $3}} | grep liberate]} error
      if {[string match *abnormally* $error]} {
      puts "No background liberate job is found\n"
      } else {
     grepLoop
      }
    }

我不需要每个内部循环,删除每个解决我的问题。 如果有任何优化的方式,请建议... 我仍然需要知道如何打破每一个循环。