Communicating Processes

   

Practical Programming in Tcl & Tk, Third Edition
By Brent B. Welch

Table of Contents
Chapter 40.  Send


Chapter 22 presented two examples: a browser for the examples in this book, and a simple shell in which to try out Tcl commands. In that chapter they are put into the same application. The two examples shown below hook these two applications together using the send command. Example 40-2 changes the Run and Reset procedures to send Tcl commands the shell defined in Example 22-4 on page 329. The StartEvalServer procedure starts up the shell, if necessary.

Example 40-2 Hooking the browser to an eval server.
 # Replace the Run and Reset procedures from # Example 22? on page 324 with these procedures # Start up the evalsrv.tcl script. proc StartEvalServer {} {    global browse    # Start the shell and pass it our name.    exec evalsrv.tcl [tk appname] &    # Wait for evalsrv.tcl to send us its name    tkwait variable browse(evalInterp) } proc Run {} {    global browse    set apps [winfo interps]    set ix [lsearch -glob $apps evalsrv.tcl*]    if {$ix < 0} {       # No evalsrv.tcl application running       StartEvalServer    }    if {![info exists browse(evalInterp)]} {       # Hook up to already running eval server       set browse(evalInterp) [lindex $apps $ix]    }    if [catch {send $browse(evalInterp) {info vars}}err] {       # It probably died - restart it.       StartEvalServer    }    # Send the command asynchronously. The two    # list commands foil the concat done by send and    # the uplevel in EvalServe    send -async $browse(evalInterp) \       [list EvalEcho [list source $browse(current)]] } # Reset the shell interpreter in the eval server proc Reset {} {    global browse    send $browse(evalInterp) {EvalEcho reset} } 

The number of lists created before the send command may seem excessive, but they are all necessary. The send command concatenates its arguments, so instead of letting it do that, we pass it a single list. Similarly, EvalServe expects a single argument that is a valid command, so list is used to construct that.

The shell in Example 22-4 on page 329 has an EvalEcho procedure that we can use as the target of send. The only thing it needs is to complete the rendez-vous with the browser. When the tcl shell starts up, it sends the browser its application name. The browser passes its own name on the command line that starts the shell, so the shell knows how to talk to the browser.

Example 40-3 Making the shell into an eval server.
 # Add this to Example 22? on page 329 if {$argc > 0} {    # Check in with the browser    send [lindex $argv 0] \       [list set browse(evalInterp) [tk appname]] } 

       
    Top
     



    Practical Programming in Tcl and Tk
    Practical Programming in Tcl and Tk (4th Edition)
    ISBN: 0130385603
    EAN: 2147483647
    Year: 1999
    Pages: 478

    flylib.com © 2008-2017.
    If you may any questions please contact us: flylib@qtcs.net