Posted to tcl by aspect at Mon Jul 04 12:13:16 GMT 2016view pretty

# after  [medranocalvo] - 2016-05-19  @ 1255
#
# using both idleproc and afterproc leads to weird behaviour:
#   afterproc never gets past the first call to [update]!
proc idleproc {} {
    while 1 {
        set i [info cmdcount]
        #puts "$i: idleproc in [info coroutine]"
        after idle [list [info coroutine]]
        yield
        update idletasks
    }
}

# unfortunately, this needs to be constantly putting itself
# at the front of the event queue so that it can wake up
# in time to process any events that have inserted themselves
# since.  So it never sleeps, which is a shame.
proc afterproc {} {
    while 1 {
        set i [info cmdcount]
        puts "$i: afterproc in [info coroutine]: yielding"
        after 0 [list [info coroutine]]
        yield
        puts "$i: afterproc in [info coroutine]: after yield"
        update
        puts "$i: afterproc in [info coroutine]: after update"
    }
}


#coroutine idlecoro idleproc
coroutine aftercoro afterproc

after idle {
    puts i:[info coroutine]
    after idle {puts ii:[info coroutine]}
}
after idle {after 0 {puts i0:\ [info coroutine]}}
after 0 {after idle {puts 0i:\ [info coroutine]}}
after 0 {puts 0:[info coroutine]}
after 100 {
    after idle {
        puts i:[info coroutine]
        after idle {puts Xii:\ [info coroutine]}
    }
    after idle {after 100 {puts XiX:\ [info coroutine]}}
    after 100 {after idle {puts XXi:\ [info coroutine]}}
    after 100 {puts XX:\ [info coroutine]}
}

set s [socket -async google.com 443]
fileevent $s writable [list apply {{s args} {
    puts "writable: [info coroutine]"
    close $s
}} $s]

vwait forever