Re: glib: processing events in multiple threads



Note that GTask replaced GSimpleAsyncResult, which has a considerably lousier API, but is still workable for doing the same thing. If you need more availability, you should use that.


On Tue, Apr 30, 2013 at 10:58 AM, Chris Vine <chris cvine freeserve co uk> wrote:
On Tue, 30 Apr 2013 10:44:43 -0400
"Jasper St. Pierre" <jstpierre mecheye net> wrote:
> On Tue, Apr 30, 2013 at 10:40 AM, Chris Vine
> <chris cvine freeserve co uk>wrote:
>
> > On Tue, 30 Apr 2013 12:01:34 +0200
> > Patrick Ohly <patrick ohly intel com> wrote:
> > > On Tue, 2013-04-30 at 10:44 +0100, jcupitt gmail com wrote:
> > > > You can do this very simple and reliably. For example:
> > > >
> > > > worker()
> > > > {
> > > >   char *str;
> > > >
> > > >   for(;;) {
> > > >     str = g_strdup("hello world!\n");
> > > >     g_idle_add(from_worker_cb, str);
> > > >     sleep(1);
> > > >   }
> > > > }
> > > >
> > > > gboolean
> > > > from_worker(char *str)
> > > > {
> > > >   update_textview(str);
> > > >   g_free(str);
> > > >   return FALSE;
> > > > }
> > >
> > > This is one-way. How about two-way communication between threads?
> >
> > In this example, the worker thread is sending stuff back to the main
> > program thread's main loop.  It presumes that the main program
> > thread has passed the work to the worker beforehand in an
> > appropriate way. That could be by starting a new thread for it, by
> > pushing it onto a thread pool, or by giving the worker thread its
> > own main loop and pushing work to it with an idle source (you can't
> > use g_idle_add() or g_idle_add_full() for that because those
> > functions do not enable you to choose your GMainContext, but it is
> > trivial to write you own function to do this in order to hand work
> > to any thread's main loop).
> >
> > I have a C++ library which implements all three approaches using
> > futures, task managers and glib main loops which I can send you an
> > url for if you are not C++ allergic.  C++ variadic templates make
> > this particularly straightforward.
> >
> Has anybody looked into GTask? It's a simple way to make a worker
> thread for some heavy processing, give it some data, and be notified
> on its completion or failure.
>
> It's the recommended way to run a synchronous task in another thread
> in the GNOME world.

That is well mentioned.  It has a nice implementation if you are stuck
with C, provided you have glib-2.36 available.  So far, I think the
only stable distribution with that version is ubuntu raring.  Possibly
arch may just have acquired it.

Chris



--
  Jasper


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]