间隔窗口的blt图?

时间:2013-11-19 18:50:14

标签: graph tcl real-time

我在tcl / tk中有一个blt实时图表,图表随时间收集数据而没有时间限制,它会将所有数据点存储到向量中,用户可以在图表中来回滚动。问题是,如果我让图表长时间收集点数,CPU和内存消耗急剧增加,我认为24小时间隔窗口应该没问题。当我尝试从图中“取消设置x(0)”时,我得到一个错误,说“命令名称无效”我也尝试使用“x delete 0”和同样的事情。非常感谢任何帮助

这是我初始化图表的方式:

proc startGraph {} {
    global btnColor
    global backColor
    global startTime
    global txtActionLevel
    global txtAlertLevel
    global x y1 y2 flagTime inStart inTime vectorFlag
    global resolution
    global notFirstTime
    global txtActionLevel
    set notFirstTime 0

    set resolution 0
    # Create stripchart widget
    blt::stripchart .s -width 625 -height 330 -background $backColor -plotbackground black -font defaultFont
     scrollbar .scroll -command { ScrollToEnd
        .s axis view x } -orient horizontal -relief flat -background black -troughcolor $backColor -activebackground black -elementborderwidth 5
    .s axis configure x -scrollcommand { .scroll set }

    # Create BLT vectors
    blt::vector create x
    blt::vector create y1
    blt::vector create y2
    set startTime 0
    set flagTime 0
    set inStart -1
    set inTime 0
    set vectorFlag 0

    .s configure -borderwidth 0 \
             -leftmargin 0 \
             -rightmargin 0 \
             -plotborderwidth 0 \
             -plotpadx {0 0} \
             -plotpady {0 0}

    .s legend configure -hide yes

    .s grid configure -color gray \
                      -dashes 1 \
                      -minor 0 \
                      -hide 0

    # X-axis

    .s axis configure x -autorange 60 \
                        -shiftby 1 \
                        -stepsize 10 \
                        -subdivisions 1 \
                        -command FormatXLabel


    # Alert txtAlertLevel
    #.s tag create line -mapx 2 -mapy 2

    proc FormatXLabel {widget x} {
        set x [expr round($x)]
        return [clock format $x -format "%I:%M:%S"]
    }

    # Y-axis
    #.s axis configure y -title "C o u n t s"
    image create photo .countsIcon -format PNG -file counts.png
    label .titleGraph -image .countsIcon -background $backColor
    place .titleGraph -in .measureView -x 0 -y 160

    # Particles
    .s element create Particles -symbol {} -color yellow -linewidth 1 \
        -smooth linear -xdata x -ydata y1

    # Bio
    .s element create Bio -symbol {} -color red -linewidth 1 \
        -smooth linear -xdata x -ydata y2


    .s marker create line -name actionLine -coords {-Inf $txtActionLevel Inf $txtActionLevel} -linewidth 1 -outline orange
    .s marker create line -name alertLine -coords {-Inf $txtAlertLevel Inf $txtAlertLevel} -linewidth 1 -outline green

    place .s -in .measureView -x 10 -y 50
    place .scroll -in .measureView -x 60 -y 380 -width 515 -height 35

    #chartTime
}

这是我将值添加到向量的地方:

set x(++end) [clock seconds]
    set flagTime 0
    set vectorFlag 1
    set len [y1 length]
    if {$len == 0} {

        set startTime $x(end)

        set y1(++end) $particle_sec
        set y2(++end) $x_summary(bio_sec)
        #if {$inStart < 0} {
        #   .s axis configure x -min "" -max ""
        #   set inStart 0
        #}
    } else {
        set y1(++end) $particle_sec
        set y2(++end) $x_summary(bio_sec)

    }

    puts "Vector length [x length]------"
    puts "First value $x(0)----------"
    #This is where i'm trying to catch whenever it reaches 60 seconds in this case
    #when the length of the vector reaches 60 seconds it will unset the first value
    #but it doesn't work it throws and invalid command name error
    if {[x length] > 60} {
         [unset -nocomplain x(0)]
    }
    #incr everyten
    add_Result $particle_sec $bioSec [format "%.2f" $fv_eff]

2 个答案:

答案 0 :(得分:0)

由于某些奇怪的原因当你使用blt :: vector创建“[unset -nocomplain x(0)]”似乎不起作用,所以我把它改回“x delete 0”而没有方括号和它现在有效。

答案 1 :(得分:0)

当您将unset -nocomplain x(0)放入[方括号]并自行拥有它时,您得到的是:

  1. 它试图取消设置该变量(我不知道是否会出现问题;我在自己的代码中不使用BLT向量)。此处会出现 no 错误。结果将是空字符串(它是documented)。
  2. 它获取结果(空字符串)并将其用作命令的单词。整个词,因为你没有与它连接。事实上,整个第一个字。您将尝试评估名称为空字符串的命令,并且不传递任何其他参数。这是一般的Tcl语义。
  3. 现在,创建一个空名称为的命令是合法的,有点棘手(因为rename到一个空字符串会删除它 - 完全限定名称是解决方法),并且高度不寻常。在你的情况下,你没有这样的命令,你真正得到的是一个错误。错误?那些方括号。
  4. 使用unset -nocomplain x(0)代替[unset -nocomplain x(0)]


    另请注意,在网上很多地方,当Tclers将Tcl代码片段内联放在没有花哨格式的地方时,他们会在代码周围加上方括号。这只是让事情更容易阅读的惯例。你不应该在Stack Overflow上看到这样的东西。