Coexisting with Other GUI Main Loops
It’s perfectly possible to have
more than one GUI main loop running concurrently. It’s a simple
matter of cooperation and balance. By balance, we mean how the events
are portioned out. It’s very easy for one main loop to
“take control” and “starve” the other loop of
processing time. In this section, we’ll demonstrate how to use
both OpenGL and Tk widgets in the same application. We’ve found
that, generally, to keep Tk events flowing, it’s sufficient to
call update
once in a while. If
update
starves OpenGL, we fall back to
DoOneEvent
.
DoOneEvent
allows
us to fine tune a Tk event loop by processing only selected events,
which we specify by bit pattern. We can inclusively
OR
the following symbols together and define the
desired bit pattern: WINDOW_EVENTS
,
FILE_EVENTS
, TIMER_EVENTS
, and
IDLE_EVENTS
. To specify all possible events, use
ALL_EVENTS
, and to make the
DoOneEvent
call nonblocking, add
DONT_WAIT
.
When passed ALL_EVENTS
,
DoOneEvent
processes events as they arise and puts
the application to sleep when no further events are outstanding.
DoOneEvent
first looks for a window or I/O event
and, if found, calls the handler and returns. If there is no window
or I/O event, it looks for a single timer event, invokes the
callback, and returns. If no window, I/O, or timer event is ready,
all pending idle callbacks are executed, if any. In all cases,
DoOneEvent
returns 1.
When passed DONT_WAIT
,
DoOneEvent
works as described, except that, if there ...
Get Mastering Perl/Tk now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.