Re: Proper way to provide gtk+ app with asynchronous data?
- From: Tristan Van Berkom <vantr touchtunes com>
- To: "Dmitry M. Shatrov" <zzidre mail ru>
- Cc: Christer Palm <palm nogui se>, gtk-list gnome org
- Subject: Re: Proper way to provide gtk+ app with asynchronous data?
- Date: Fri, 09 Jul 2004 16:26:14 -0400
Dmitry M. Shatrov wrote:
[ ... ]
Could you point to some additional documentation on how to actually
create own `GSource`s? An example? I'm stuck with it just because plain
glib docs didn't give me understanding of what is what, and google was
also successfull in keeping the secret.
A good example would be the g-io-channel sources, take a look at
giounix.c, a GSource must provide four functions to integrated it
as an event source into the main loop (see:
http://developer.gnome.org/doc/API/2.0/glib/glib-The-Main-Event-Loop.html
for an enlightening discusion on how the mainloop functions) :
GSourceFuncs g_io_watch_funcs = {
g_io_unix_prepare, // I believe this is called every time the mainloop
// for this thread/process is ready to go into
// "wait state", you'll need to check into that for sure.
g_io_unix_check, // is this source ready to be dispatched ?
g_io_unix_dispatch, // call the appropriate callback for this source
g_io_unix_finalize // free allocated stuff etc... (called when the
// user calls g_source_remove or when the user
// callback returns FALSE).
};
You would basicly want your "check" function to return TRUE when
there is data on the GAsyncQueue.
To create a source (g_io_add_watch):
static GSource *
g_io_unix_create_watch (GIOChannel *channel,
GIOCondition condition)
{
GSource *source;
GIOUnixWatch *watch;
/*...*/
/* Here the "watch" is and extended version of the GSource structure;
* glib will use the "g_io_watch_funcs" to work with the source and
* anything else you will need to know you can use this extended struct
* for (example, you will probably want to know what GAsyncQueue you
* are going to pop stuff off of in your "check" func).
*/
source = g_source_new (&g_io_watch_funcs, sizeof (GIOUnixWatch));
watch = (GIOUnixWatch *)source;
/*...*/
}
Hope this helps ;-)
Cheers,
-Tristan
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]