yyamasak
3/7/2016 - 10:06 AM

An example to replace vwait with coroutine

An example to replace vwait with coroutine

proc log {msg} {
	set ts [clock format [clock seconds] -format %T]
	puts "\[$ts\] $msg"
}

proc backtrace {} {
	set frames [list]
    for {set i 1} {$i < [info level]} {incr i} {
		set frameinfo [info frame $i]
		if {[dict exists $frameinfo cmd]} {
	        lappend frames [dict get $frameinfo cmd]
	    }
    }
    return $frames
}

proc init_process {} {
	global proceed
	set proceed wait
}

proc start_process {} {
	after 2000 end_process
}

proc end_process {} {
	global proceed
	set proceed go
}

proc sequence_1 {} {
	global proceed
	init_process
	start_process
	log "proceed=$proceed"
	vwait proceed
	log "proceed=$proceed"
}

proc sequence_2 {} {
	global proceed
	init_process
	set co [info coroutine]
	trace add variable ::proceed write [list traceproc $co]
	start_process
	log "proceed=$proceed"
	yield
	log "proceed=$proceed"
}

proc traceproc {co var key op} {
	trace remove variable ::proceed write [list traceproc $co]
	$co
}

sequence_1
coroutine co_sequence sequence_2

vwait forever

# (bin) 2 % sequence_1
# [19:02:44] proceed=wait
# [19:02:46] proceed=go
# (bin) 3 % coroutine co_sequence sequence_2
# [19:02:46] proceed=wait
# [19:02:48] proceed=go