Posted to tcl by Julian Noble at Thu Mar 06 07:09:19 GMT 2025view raw
- set arg1 [lindex $::argv 0]
- interp create code1
- interp create code2
- puts stderr "loading Thread package in all 3 interps"
- package require Thread
- code1 eval {package require Thread}
- code2 eval {package require Thread}
- puts stderr "establishing ::testfunc proc in all 3 interps"
- code1 eval {proc ::testfunc {args} {puts stderr "evaluated in code1 interp: $args"}}
- code2 eval {proc ::testfunc {args} {puts stderr "evaluated in code2 interp: $args"}}
- proc ::testfunc {args} {puts stderr "evaluated in parent interp: $args"}
- puts stderr "Calling a thread function in nominated interp '$arg1' first"
- #1st use of thread function makes that interp the one to receive all subsequent messages
- switch -- $arg1 {
- parent {
- thread::id
- }
- code1 {
- code1 eval {thread::id}
- }
- code2 {
- code2 eval {thread::id}
- }
- default {
- puts stderr "Usage thread_interp.tcl parent|code1|code1"
- exit 1
- }
- }
- puts stderr "sending scripts"
- thread::send -async [thread::id] {
- ::testfunc script sent from parent interp
- }
- code1 eval {
- thread::send -async [thread::id] {
- ::testfunc script sent from code1 interp
- }
- }
- code2 eval {
- thread::send -async [thread::id] {
- ::testfunc script sent from code2 interp
- }
- }
- #test
- after 0 {::testfunc after script in parent interp}
- code1 eval {after 0 {::testfunc after script in code1 interp}}
- code2 eval {after 0 {::testfunc after script in code2 interp}}
- code1 eval {
- set workertid [thread::create]
- thread::send $workertid {package require Thread}
- thread::send $workertid [list thread::send -async [thread::id] {
- ::testfunc script sent from code1 interp via worker
- }]
- }
- after idle {set ::done 1}
- vwait ::done
Add a comment