ZetCode

Tcl vwait Command

last modified April 3, 2025

The Tcl vwait command is used to wait for variable modifications in the event loop. It's essential for event-driven programming in Tcl.

Basic Definition

The vwait command enters the event loop and waits until a specified variable is modified. It processes events while waiting for the change.

Syntax: vwait varName. The command blocks until varName is modified via set or unset commands.

Simple vwait Example

This demonstrates the basic usage of vwait to wait for a variable change.

basic_vwait.tcl
set done 0
after 1000 {set done 1}
puts "Waiting for variable change..."
vwait done
puts "Variable changed, continuing execution"

This script sets a timer to modify done after 1 second. The vwait blocks until this change occurs, then continues execution.

vwait with User Input

vwait can be used to wait for user input in console applications.

vwait_input.tcl
set input ""
puts "Enter some text and press Enter:"
fileevent stdin readable {set input [gets stdin]}
vwait input
puts "You entered: $input"

This example sets up a file event handler for stdin. vwait waits until the user enters text and presses Enter, storing the input in the variable.

vwait with Socket Communication

vwait is commonly used in network programming to wait for data.

vwait_socket.tcl
package require Tcl 8.6

set response ""
socket -async www.example.com 80
fileevent $sock readable {set response [read $sock]}
puts $sock "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n"
vwait response
puts "Received [string length $response] bytes"

This creates an asynchronous socket connection. vwait blocks until data is received and stored in response. The event loop processes network events while waiting.

vwait in GUI Applications

In Tk applications, vwait can be used to wait for GUI events.

vwait_gui.tcl
package require Tk

set clicked 0
button .btn -text "Click Me" -command {set clicked 1}
pack .btn
puts "Waiting for button click..."
vwait clicked
puts "Button was clicked!"

This creates a simple Tk button. The script waits with vwait until the button is clicked, which sets the clicked variable to 1.

Nested vwait Commands

Multiple vwait commands can be nested to handle complex scenarios.

vwait_nested.tcl
set step1 0
set step2 0

after 500 {set step1 1}
after 1000 {set step2 1}

puts "Waiting for first event..."
vwait step1
puts "First event received, waiting for second..."
vwait step2
puts "Both events received"

This demonstrates nested vwait commands waiting for sequential events. Each vwait processes events until its variable is set.

vwait with Multiple Variables

A single vwait can wait for changes to any of multiple variables.

vwait_multiple.tcl
set event1 0
set event2 0

after 800 {set event1 1}
after 1200 {set event2 1}

proc waitForAny {vars} {
    global $vars
    set waiting 1
    foreach var $vars {
        trace add variable $var write [list apply {args {global waiting; set waiting 0}}]
    }
    vwait waiting
    foreach var $vars {
        trace remove variable $var write [list apply {args {global waiting; set waiting 0}}]
    }
}

puts "Waiting for either event..."
waitForAny {event1 event2}
puts "An event occurred: event1=$event1, event2=$event2"

This advanced example shows how to wait for changes to any of several variables. It uses variable traces to implement the multi-variable wait functionality.

Best Practices

This tutorial covered the Tcl vwait command with practical examples showing its usage in different scenarios.

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all Tcl Tutorials.