A graphical user interface is an inherently multi-threaded system: one thread is the program managing windows on the screen, and the other thread is the user moving the mouse and typing at the keyboard. GUI programs typically use an event queue to translate this multi-threaded system into a sequential one, at least from the programmer's point of view. Each user action is handled one at a time, ignoring further user actions until the previous one is completely handled. The conversion from a multi-threaded process to a single-threaded one greatly simplies the implementation of GUI programs.
Despite the programming convenience provided by a purely sequential event queue, certain situations require a less rigid dialog with the user:
In MrEd, an eventspace is a context for processing GUI events. Each eventspace maintains its own queue of events, and events in a single eventspace are dispatched sequentially by a designated handler thread. An event-handling procedure running in this handler thread can yield to the system by calling yield, in which case other event-handling procedures may be called in a nested (but single-threaded) manner within the same handler thread. Events from different eventspaces are dispatched asynchronously by separate handler threads.
When a frame or dialog is created without a parent, it is associated
with the current eventspace as described in
Creating and Setting the Eventspace. Events for a top-level window
and its decendents are always dispatched in the window's eventspace.
Every dialog is modal; a dialog's show
method implcitly calls yield to handle events while
the dialog is shown. (See also Eventspaces and Threads for information about threads and
modal dialogs.) Furthermore, when a modal dialog is shown, the system
disables all other top-level windows in the dialog's
eventspace,
but windows in other
eventspaces are unaffected by the modal dialog.