这是我的编码。我遇到一个问题,它仍然在运行时没有显示“.display_message”。我只在proc torun {}完成任务后收到消息。顺便说一句,2000年以后其实是我的程序运行。这是一个非常长的代码,我觉得它不适用所以我删除它以简化它。请指导我。感谢。
proc torun {} {
set total [.display_pc2 size]
.display_message insert end "test"
for {set x 0} {$x < $total} {incr x} {
set machine [.display_pc2 get $x]
.display_message insert end "Copy to $machine now. Please wait..."
.display_message see end
after 2000
.display_message insert end "Copy to $machine done"
.display_message see end
after 2000
}
}
答案 0 :(得分:2)
您应该完全更改编写此代码的方式并使用idle callbacks。
这个想法是你创建一个要执行的“任务”列表(可能是目标计算机列表),将其保存在某处,然后一次处理一个项目,使用空闲回调重新安排执行。 / p>
草图如下:
proc show_transfer_start {target} {
.display_progress add ... $target
}
proc show_transfer_result {res} {
.display_progress add ... $res
}
proc schedule_transfer {target rest} {
after idle [after 0 [list do_step $target $rest]]
}
proc do_step {target rest} {
set res [copy --to $target]
show_transfer_result $res
if {[llength $rest] > 0} {
set next [lindex $rest 0]
show_transfer_start $next
schedule_tranfer $next [lrange $rest 1 end]
}
}
set targets [list box1 box2 box3]
set first [lindex $targets 0]
show_transfer_start $first
schedule_transfer $first [lrange $targets 1 end]
答案 1 :(得分:0)
我从来没有做过tk(如果它是gui你在做什么),但是在使用flush
强制显示消息时,你可能需要等同于puts
。
因为我无法猜出.display_message
proc。
修改强>
刚才有一个想法:您可以使用after
命令假冒 - 多线程化您的应用。
after 0 [list .display_message insert end "Copy to $machine now. Please wait..."; .display_message see end]
将独立于当前proc作为事件处理程序运行。也许这可以修复你的冲洗问题。 (需要eventloop或update
命令)