LINUX.ORG.RU

[tcl]Генерация событий


0

0

Каким образом в тикле сделать циклическую асинхронную генерацию событий по таймеру. Т.е. нужно чтобы периодически вызывалась команда, при этом осуществлялась обработка других событий. Должно быть простое решение, наподобие закоментированного цикла, если кто подскажет буду благодарен. Ато придется это организовывать через потоки.

proc main {} {
    global	exit_trigger
    wm title . "Regulating model"
    wm geometry . +200+100

    grid [frame .f] -sticky news 
    canvas [set c .f.c] -width 1000 -height 500 -background white
    grid $c -sticky news -padx 5 -columnspan 2
    set line_height 250
    put_line $c $line_height
     
    grid [button .f.config_button -text Setup -command main_exit] -sticky we -row 1 -column 0
    grid [button .f.quit -text Exit -command main_exit] -sticky we -row 1 -column 1 
    focus .f.quit
    bind .f.quit <Return> main_exit
    bind . <Escape> main_exit

    set exit_trigger 0
    interp alias {} main_exit {} set exit_trigger 1
    vwait exit_trigger

#   while "!$exit_trigger" {
#	    after 500
#	    exec_periodical_proc
#	    if "$exit_trigger > 0" break;
#    }

    exit
}

При ожидании , вызванном командой vwait (или tkwait ) , Tcl не прекращает цикл обработки событий и обработчики событий продолжают вызываться.

подобное:
set flag 0;
while {1} {
after 500 {
puts «tik timer»;
}
vwait flag;
}

т.е будет барабанить puts «tik timer» и отрабатывать изменения в Тк .


elipse ★★★ ()
Ответ на: комментарий от elipse

Хотя нет, в таком варианте цикл продолжается только когда vwait дождется установления переменной, что собственно не нужно.

     while "1" {
	     after 500 {
	         puts "Hello"
	     }
	     vwait exit_trigger
     }

Было бы неплохо, еслиб существовал аналог vwait, только не блокирующий программу.

nkondratev ()
Ответ на: комментарий от nkondratev

proc action {} {
   global exit_trigger
   if {$exit_trigger == 0} {
      puts «action»
      after 500 action
   }
}

wm title . «Regulating model»
wm geometry . +200+100

grid [frame .f] -sticky news
canvas [set c .f.c] -width 1000 -height 500 -background white
grid $c -sticky news -padx 5 -columnspan 2
set line_height 250

grid [button .f.config_button -text Setup -command main_exit] -sticky we -row 1 -column 0
grid [button .f.quit -text Exit -command main_exit] -sticky we -row 1 -column 1
focus .f.quit
bind .f.quit <Return> main_exit
bind . <Escape> main_exit

set exit_trigger 0
interp alias {} main_exit {} set exit_trigger 1

action

placement_new ★★ ()
Ответ на: комментарий от nkondratev
entry .e -width 50 -bg white -relief sunken
button .doit -text "Run command" -command {puts stdout [exec -keepnewline [.e get] &] }
button .quit -text "Exit" -command exit
pack .e .doit .quit -side top -pady 5


while {1} {
	set flag 1;
	after 500 {
      puts "tik timer";set flag 0;
   }
  vwait flag;
}
elipse ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.