It is possible to create new instances of GMainLoop recursively. This is often used in GTK+ applications when showing modal dialog boxes.
To allow multiple independent sets of sources to be handled in different threads, each source is associated with a GMainContext. A GMainContext can only be running in a single thread, but sources can be added to it and removed from it from other threads.
event sources are associated with a particular GMainContext, and will be checked and dispatched for all main loops associated with that GMainContext.
Each event source is assigned a priority. The default priority, G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher priorities. Values greater than 0 denote lower priorities. Events from high priority sources are always processed before events from lower priority sources.
A new source type is created by deriving from the GSource structure. The derived type of source is represented by a structure that has the GSource structure as a first element, and other elements specific to the new source type. To create an instance of the new source type, call g_source_new()
passing in the size of the derived structure and a table of functions. These GSourceFuncs determine the behavior of the new source types.
- typedef struct {
- gboolean (*prepare) (GSource *source,
- gint *timeout_);
- gboolean (*check) (GSource *source);
- gboolean (*dispatch) (GSource *source,
- GSourceFunc callback,
- gpointer user_data);
- void (*finalize) (GSource *source); /* Can be NULL */
- /* For use by g_source_set_closure */
- GSourceFunc closure_callback;
- GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */
- } GSourceFuncs;
- For idle sources, the prepare and check functions always return
TRUE
to indicate that the source is always ready to be processed. The prepare function also returns a timeout value of 0 to ensure that thepoll()
call doesn't block (since that would be time wasted which could have been spent running the idle function).
- For timeout sources, the prepare and check functions both return
TRUE
if the timeout interval has expired. The prepare function also returns a timeout value to ensure that thepoll()
call doesn't block too long and miss the next timeout.
- For file descriptor sources, the prepare function typically returns
FALSE
, since it must wait untilpoll()
has been called before it knows whether any events need to be processed. It sets the returned timeout to -1 to indicate that it doesn't mind how long thepoll()
call blocks. In the check function, it tests the results of thepoll()
call to see if the required condition has been met, and returnsTRUE
if so.
Updating the GUI during a long computation.
/* computation going on */ ... while (gtk_events_pending ()) gtk_main_iteration (); ... /* computation continued */