Event Loops
MainLoop
executes an
event loop that picks up events from the underlying windowing system
and dispatches it to the appropriate widgets. When a callback
procedure is called in response to an event, it is the responsibility
of the callback to return (or “yield”) as soon as
possible; otherwise, it holds up all events that have since arrived.
For long-running activities that are CPU-intensive, it is your responsibility to chop that activity up into manageable pieces and arrange for a timer to call the processing routine at regular intervals. This gives the event loop a chance to dispatch pending events. This kind of CPU sharing is called cooperative multitasking. Early versions of Microsoft Windows (until Version 3.1) similarly depended on your application being a good citizen; otherwise, it would hang the entire operating system.
For tasks such as ray-tracing and animations that are both CPU- and
GUI-intensive, you can use the
$widget—>update
method to process all
events. This method doesn’t return until all pending event
messages (including repaint events) in the event queue have been
processed.
Blocking system calls are not a very good
idea in an event-driven environment, as we discussed in Chapter 12. The most common of these are the
read
and write
calls,
especially if they are talking to pipes and sockets. For example, the
diamond operator (<>
) blocks until it can get a line of text. Instead of directly calling an I/O call, you must let Perl/Tk tell you that it is ...
Get Advanced Perl Programming 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.