Tcl 同时秒表和计数器不工作
Tcl simultaneous stopwatch and counter not working
我有一个 TK/TCL 秒表从 xterm 启动 unix 计数器,但它不显示
计数器图像中的计数。 unix 计数器完成后(它有 4 次迭代),然后
秒表中的显示屏显示并计数。
单击 运行 按钮后如何继续显示计数?
stopwatch with its buttons control
这是代码(在第 3 行替换你合适的 'wish'):
#!/bin/sh
####################################################################### \
exec /sw/freetools/tk/8.5.6/Linux/rh5/x86_64/bin/wish8.5 "[=10=]" ${1+"$@"}
package require Tk
wm title . "TEST-GUI"
. configure -padx 50 -pady 50 -relief raised -borderwidth 2
###STOPWATCH -begin-
set COLOR_BACKGROUND "black"
set COLOR_FOREGROUND "sky blue"
font create FONT0 -family {VL PGothic} -size -20 -weight normal
set ::time 00:00:00
proc every {ms body} {
eval $body
after $ms [namespace code [info level 0]]
}
proc Start {} {
if {$::time eq {00:00:00}} {
set ::time0 [clock clicks -milliseconds]
}
every 10 {
set m [expr {[clock clicks -milliseconds] - $::time0}]
set ::time [format %2.2d:%2.2d:%2.2d [expr {$m/60000}] [expr {($m/1000)%60}] [expr {$m%1000/10}]]
}
.frame1.run config -state disabled
}
proc Stop {} {
if {[llength [after info]]} {
after cancel [after info]
} else {set ::time 00:00:00}
.frame1.run config -state normal
}
###STOPWATCH -end-
frame .frame1 -highlightbackground black \
-highlightthickness 1 \
-width 200 -height 200
label .frame1.time -textvar ::time -font FONT0 -background $COLOR_BACKGROUND -foreground $COLOR_FOREGROUND
button .frame1.run -text "RUN" -foreground black -bg coral \
-borderwidth 3 -height 0 -width 3 -font {-family symbol -size 8} -pady 2 \
-command {
Start
gui_run
}
button .frame1.exit -text "EXIT" -foreground black \
-borderwidth 3 -height 0 -width 3 -font {-family symbol -size 8} -pady 2 \
-command {exit}
pack .frame1
pack .frame1.run -side top
pack .frame1.exit -side bottom
pack .frame1.time
proc xterm_counter {} {
set fileid [open "./xterm_counter.txt" w]
puts $fileid "#!/bin/csh -f"
puts $fileid ""
puts $fileid "set i = 0"
puts $fileid "echo \"testing programm counting -start- \`date +%X\`\""
puts $fileid "while ($i <= 3)"
puts $fileid " sleep 2"
puts $fileid " set i = \`expr $i + 1\`"
puts $fileid " echo \"testing programm counting here => $i\""
puts $fileid "end"
puts $fileid "echo \"testing programm counting -end- \`date +%X\`\""
close $fileid
}
proc gui_run {} {
xterm_counter
exec chmod 744 "./xterm_counter.txt"
if {[catch {exec ./xterm_counter.txt >@ stdout}]} {
puts "RUN FAILED, exit programm"
exit
} else {
puts "RUN SUCCESSFULL, stop stopwatch now"
}
}
我无法在计时完成后停止秒表。
我在按钮中添加了“停止”命令。frame1.run 来执行它,但不起作用:
button .frame1.run -text "RUN" -foreground black -bg coral \
-borderwidth 3 -height 0 -width 3 -font {-family symbol -size 8} -pady 2 \
-command {
Start
gui_run
puts "after.."
after 1000
puts "Stop.."
Stop
}
另外一点就是如何运行同时把计数器和秒表放在一起,
当计数器完成时,秒表应该停止..?
问题是 exec
命令暂停 Tcl 进程,直到另一个进程完成 运行ning。对于像 chmod
的 运行ning 这样快速的东西来说,这不是一个大问题,但是对于长时间的 运行ning 计时器显示来说,这是一个主要的痛苦。
最简单的解决方法,尤其是如果您不太关心子进程是否非常有效,就是在 exec
末尾放置一个 &
单词,因此代码是 运行 在后台,与 Tcl 断开连接。
exec ./xterm_counter.txt >@stdout &
(那个returns进程ID,如果我没记错的话,让你定期拉取终止。)
如果这对您不起作用,您的选择是 运行 管道中的代码(通过该重定向,它将成为只写管道)或 运行它来自工作线程。
我有一个 TK/TCL 秒表从 xterm 启动 unix 计数器,但它不显示 计数器图像中的计数。 unix 计数器完成后(它有 4 次迭代),然后 秒表中的显示屏显示并计数。 单击 运行 按钮后如何继续显示计数?
stopwatch with its buttons control
这是代码(在第 3 行替换你合适的 'wish'):
#!/bin/sh
####################################################################### \
exec /sw/freetools/tk/8.5.6/Linux/rh5/x86_64/bin/wish8.5 "[=10=]" ${1+"$@"}
package require Tk
wm title . "TEST-GUI"
. configure -padx 50 -pady 50 -relief raised -borderwidth 2
###STOPWATCH -begin-
set COLOR_BACKGROUND "black"
set COLOR_FOREGROUND "sky blue"
font create FONT0 -family {VL PGothic} -size -20 -weight normal
set ::time 00:00:00
proc every {ms body} {
eval $body
after $ms [namespace code [info level 0]]
}
proc Start {} {
if {$::time eq {00:00:00}} {
set ::time0 [clock clicks -milliseconds]
}
every 10 {
set m [expr {[clock clicks -milliseconds] - $::time0}]
set ::time [format %2.2d:%2.2d:%2.2d [expr {$m/60000}] [expr {($m/1000)%60}] [expr {$m%1000/10}]]
}
.frame1.run config -state disabled
}
proc Stop {} {
if {[llength [after info]]} {
after cancel [after info]
} else {set ::time 00:00:00}
.frame1.run config -state normal
}
###STOPWATCH -end-
frame .frame1 -highlightbackground black \
-highlightthickness 1 \
-width 200 -height 200
label .frame1.time -textvar ::time -font FONT0 -background $COLOR_BACKGROUND -foreground $COLOR_FOREGROUND
button .frame1.run -text "RUN" -foreground black -bg coral \
-borderwidth 3 -height 0 -width 3 -font {-family symbol -size 8} -pady 2 \
-command {
Start
gui_run
}
button .frame1.exit -text "EXIT" -foreground black \
-borderwidth 3 -height 0 -width 3 -font {-family symbol -size 8} -pady 2 \
-command {exit}
pack .frame1
pack .frame1.run -side top
pack .frame1.exit -side bottom
pack .frame1.time
proc xterm_counter {} {
set fileid [open "./xterm_counter.txt" w]
puts $fileid "#!/bin/csh -f"
puts $fileid ""
puts $fileid "set i = 0"
puts $fileid "echo \"testing programm counting -start- \`date +%X\`\""
puts $fileid "while ($i <= 3)"
puts $fileid " sleep 2"
puts $fileid " set i = \`expr $i + 1\`"
puts $fileid " echo \"testing programm counting here => $i\""
puts $fileid "end"
puts $fileid "echo \"testing programm counting -end- \`date +%X\`\""
close $fileid
}
proc gui_run {} {
xterm_counter
exec chmod 744 "./xterm_counter.txt"
if {[catch {exec ./xterm_counter.txt >@ stdout}]} {
puts "RUN FAILED, exit programm"
exit
} else {
puts "RUN SUCCESSFULL, stop stopwatch now"
}
}
我无法在计时完成后停止秒表。 我在按钮中添加了“停止”命令。frame1.run 来执行它,但不起作用:
button .frame1.run -text "RUN" -foreground black -bg coral \
-borderwidth 3 -height 0 -width 3 -font {-family symbol -size 8} -pady 2 \
-command {
Start
gui_run
puts "after.."
after 1000
puts "Stop.."
Stop
}
另外一点就是如何运行同时把计数器和秒表放在一起, 当计数器完成时,秒表应该停止..?
问题是 exec
命令暂停 Tcl 进程,直到另一个进程完成 运行ning。对于像 chmod
的 运行ning 这样快速的东西来说,这不是一个大问题,但是对于长时间的 运行ning 计时器显示来说,这是一个主要的痛苦。
最简单的解决方法,尤其是如果您不太关心子进程是否非常有效,就是在 exec
末尾放置一个 &
单词,因此代码是 运行 在后台,与 Tcl 断开连接。
exec ./xterm_counter.txt >@stdout &
(那个returns进程ID,如果我没记错的话,让你定期拉取终止。)
如果这对您不起作用,您的选择是 运行 管道中的代码(通过该重定向,它将成为只写管道)或 运行它来自工作线程。