On Wed, 28 Sep 2011 22:40:25 +0900 Daniel Juyung Seo <seojuyu...@gmail.com>
said:

that was the whole point. i kept being sucked away from this - i started these
examples weeks ago and everything else got in my way of finishing. it's now in
the docs. they absolutely MUST read this *IF* they are to use threads with EFL
*AT ALL*. they NEED to take the examples given and use the "design pattern"
there. i.e. DONT do efl stuff in the threads (without moving the efl calls out
of the thread via one of various mechanisms OR by using the lock-step
mechanisms given in the first 2 examples). i still encourage people to avoid
threads, and if they really need them, think carefully about the use and
isolate the thread functions and data so it's almost like another process you
IPC to/from.

> This is beautiful.
> I bet manymanymanymanymany application programmers SHOULD read this.
> Thanks raster!
> 
> Daniel Juyung Seo (SeoZ)
> 
> On Wed, Sep 28, 2011 at 8:53 PM, Enlightenment SVN
> <no-re...@enlightenment.org> wrote:
> > Log:
> > Document how to use thread with EFL in nice detail for "beginners" who
> >  know already how to use threads (pthread) and then how to use that
> >  with EFL.
> >
> >
> >
> > Author:       raster
> > Date:         2011-09-28 04:53:41 -0700 (Wed, 28 Sep 2011)
> > New Revision: 63641
> > Trac:         http://trac.enlightenment.org/e/changeset/63641
> >
> > Added:
> >  trunk/elementary/src/examples/efl_thread_1.c
> > trunk/elementary/src/examples/efl_thread_2.c
> > trunk/elementary/src/examples/efl_thread_3.c
> > trunk/elementary/src/examples/efl_thread_4.c
> > trunk/elementary/src/examples/efl_thread_5.c
> > trunk/elementary/src/examples/efl_thread_6.c Modified:
> > trunk/elementary/doc/examples.dox trunk/elementary/doc/index.doxy
> > trunk/elementary/src/examples/Makefile.am
> >
> > Modified: trunk/elementary/doc/examples.dox
> > ===================================================================
> > --- trunk/elementary/doc/examples.dox   2011-09-28 09:14:40 UTC (rev 63640)
> > +++ trunk/elementary/doc/examples.dox   2011-09-28 11:53:41 UTC (rev 63641)
> > @@ -92,6 +92,18 @@
> >  * @ref progressbar_example
> >  *
> >  * @ref slideshow_example
> > + *
> > + * @ref efl_thread_1
> > + *
> > + * @ref efl_thread_2
> > + *
> > + * @ref efl_thread_3
> > + *
> > + * @ref efl_thread_4
> > + *
> > + * @ref efl_thread_5
> > + *
> > + * @ref efl_thread_6
> >  */
> >
> >  /**
> > @@ -5928,6 +5940,125 @@
> >  */
> >
> >  /**
> > + * @page efl_thread_1 EFL Threading example 1
> > + *
> > + * You can use threads with Elementary (and EFL) but you need to be careful
> > + * to only use eina or eet calls inside a thread. Other libraries are not
> > + * totally threadsafe except for some specific ecore calls designed for
> > + * working from threads like the ecore_pipe_write() and ecore_thread calls.
> > + *
> > + * Below is an example of how to use EFL calls from a native thread you
> > have
> > + * already created. You have to put the EFL calls inside the critical block
> > + * between ecore_thread_main_loop_begin() and ecore_thread_main_loop_end()
> > + * which ensure you gain a lock on the mainloop. Beware that this requires
> > + * that the thread WAIT to synchronize with the mainloop at the beginning
> > of
> > + * the critical section. It is highly suggested you use as few of these
> > + * in your thread as possible and probably put just a single
> > + * ecore_thread_main_loop_begin() / ecore_thread_main_loop_end() section
> > + * at the end of the threads calculation or work when it is done and
> > + * would otherwise exit to sit idle.
> > + *
> > + * For a progression of examples that become more complex and show other
> > + * ways to use threading with EFL, please see:
> > + *
> > + * @ref efl_thread_2
> > + *
> > + * @ref efl_thread_3
> > + *
> > + * @ref efl_thread_4
> > + *
> > + * @ref efl_thread_5
> > + *
> > + * @ref efl_thread_6
> > + *
> > + * @include efl_thread_1.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_2 EFL Threading example 2
> > + *
> > + * You can also use ecore_main_loop_thread_safe_call_sync() to call a
> > + * specific function that needs to do EFL main loop operations. This call
> > + * will block and wait to synchronise to the mainloop just like
> > + * ecore_thread_main_loop_begin() / ecore_thread_main_loop_end() will,
> > + * but instead you simply provide it the function callback to call instead
> > + * of inlining your code.
> > + *
> > + * @ref efl_thread_3
> > + *
> > + * @ref efl_thread_4
> > + *
> > + * @ref efl_thread_5
> > + *
> > + * @ref efl_thread_6
> > + *
> > + * @include efl_thread_2.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_3 EFL Threading example 3
> > + *
> > + * Like with ecore_main_loop_thread_safe_call_sync() you can provide a
> > + * callback to call inline in the mainloop, but this time with
> > + * ecore_main_loop_thread_safe_call_async() the callback is queued and
> > + * called asynchronously, without the thread blocking. The mainloop will
> > + * call this function when it comes around to its synchronisation point.
> > This
> > + * acts as a "fire and forget" way of having the mainloop do some work
> > + * for a thread that has finished processing some data and is read to hand
> > it
> > + * off to the mainloop and the thread wants to march on and do some more
> > work
> > + * while the main loop deals with "displaying" the results of the previous
> > + * calculation.
> > + *
> > + * @ref efl_thread_4
> > + *
> > + * @ref efl_thread_5
> > + *
> > + * @ref efl_thread_6
> > + *
> > + * @include efl_thread_3.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_4 EFL Threading example 4
> > + *
> > + * Now when you want to have a thread do some work, send back results to
> > + * the mainloop and continue running but the mainloop controls when the
> > + * thread should stop working, you need some extra flags. This is an
> > example
> > + * of how you might use ecore_main_loop_thread_safe_call_async() and
> > pthreads
> > + * to do this.
> > + *
> > + * @ref efl_thread_5
> > + *
> > + * @ref efl_thread_6
> > + *
> > + * @include efl_thread_4.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_5 EFL Threading example 5
> > + *
> > + * This is the same as @ref efl_thread_4 but now uses the ecore_thread
> > + * infrastructure to have a running worker thread that feeds results back
> > + * to the mainloop and can easily be cancelled. This saves some code in the
> > + * application and makes for fewer problem spots if you forget a mutex.
> > + *
> > + * @ref efl_thread_6
> > + *
> > + * @include efl_thread_5.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_6 EFL Threading example 6
> > + *
> > + * You can also use the ecore_thread infrastructure for compute tasks that
> > + * don't send feedback as they go - they are one-shot compute jobs and when
> > + * done they will trigger the end callback in the mainloop which is
> > intended
> > + * to pick up the results and "display them".
> > + *
> > + * @include efl_thread_6.c
> > + */
> > +
> > +/**
> >  * @page bg_example_01_c bg_example_01.c
> >  * @include bg_example_01.c
> >  * @example bg_example_01.c
> > @@ -6087,3 +6218,39 @@
> >  * @include slideshow_example.c
> >  * @example slideshow_example.c
> >  */
> > +
> > +/**
> > + * @page efl_thread_1_c EFL Threading example 1
> > + * @include efl_thread_1.c
> > + * @example efl_thread_1.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_2_c EFL Threading example 2
> > + * @include efl_thread_2.c
> > + * @example efl_thread_2.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_3_c EFL Threading example 3
> > + * @include efl_thread_3.c
> > + * @example efl_thread_3.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_4_c EFL Threading example 4
> > + * @include efl_thread_4.c
> > + * @example efl_thread_4.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_5_c EFL Threading example 5
> > + * @include efl_thread_5.c
> > + * @example efl_thread_5.c
> > + */
> > +
> > +/**
> > + * @page efl_thread_6_c EFL Threading example 6
> > + * @include efl_thread_6.c
> > + * @example efl_thread_6.c
> > + */
> >
> > Modified: trunk/elementary/doc/index.doxy
> > ===================================================================
> > --- trunk/elementary/doc/index.doxy     2011-09-28 09:14:40 UTC (rev 63640)
> > +++ trunk/elementary/doc/index.doxy     2011-09-28 11:53:41 UTC (rev 63641)
> > @@ -30,6 +30,9 @@
> >  * @li @ref widgetslist - These are the widgets you'll compose your UI out
> > of.
> >  * @li @ref containerslist - These are the containers in which the widgets
> > will
> >  *                           be laid out.
> > + *
> > + * Also see other generic EFL programming guides:
> > + * @li @ref threading
> >  */
> >  /**
> >  * @page widgetslist Widget list
> > @@ -290,3 +293,23 @@
> >  * @li @ref infralist - These are modules that deal with Elementary as a
> > whole.
> >  * @li @ref widgetslist - These are the widgets you'll compose your UI out
> > of. */
> > +/**
> > + * @page threading Threading
> > + *
> > + * You may use threads with EFL, but only in specific ways. If you plan on
> > + * using threads it is very important you see the following example guides.
> > + * See the following
> > + *
> > + * @ref efl_thread_1
> > + *
> > + * @ref efl_thread_2
> > + *
> > + * @ref efl_thread_3
> > + *
> > + * @ref efl_thread_4
> > + *
> > + * @ref efl_thread_5
> > + *
> > + * @ref efl_thread_6
> > + *
> > + */
> >
> > Modified: trunk/elementary/src/examples/Makefile.am
> > ===================================================================
> > --- trunk/elementary/src/examples/Makefile.am   2011-09-28 09:14:40 UTC
> > (rev 63640) +++ trunk/elementary/src/examples/Makefile.am   2011-09-28
> > 11:53:41 UTC (rev 63641) @@ -115,7 +115,13 @@
> >        table_example_02.c \
> >        menu_example_01.c \
> >        thumb_example_01.c \
> > -       win_example.c
> > +       win_example.c \
> > +        efl_thread_1.c \
> > +        efl_thread_2.c \
> > +        efl_thread_3.c \
> > +        efl_thread_4.c \
> > +        efl_thread_5.c \
> > +        efl_thread_6.c
> >
> >  pkglib_PROGRAMS =
> >
> > @@ -217,7 +223,13 @@
> >        table_example_02 \
> >        menu_example_01 \
> >        thumb_example_01 \
> > -       win_example
> > +       win_example \
> > +        efl_thread_1 \
> > +        efl_thread_2 \
> > +        efl_thread_3 \
> > +        efl_thread_4 \
> > +        efl_thread_5 \
> > +        efl_thread_6
> >
> >  # This variable will hold the list of screenshots that will be made
> >  # by "make screenshots". Each item in the list is of the form:
> >
> >
> > ------------------------------------------------------------------------------
> > All the data continuously generated in your IT infrastructure contains a
> > definitive record of customers, application performance, security
> > threats, fraudulent activity and more. Splunk takes this data and makes
> > sense of it. Business sense. IT sense. Common sense.
> > http://p.sf.net/sfu/splunk-d2dcopy1
> > _______________________________________________
> > enlightenment-svn mailing list
> > enlightenment-...@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
> >
> 
> ------------------------------------------------------------------------------
> All the data continuously generated in your IT infrastructure contains a
> definitive record of customers, application performance, security
> threats, fraudulent activity and more. Splunk takes this data and makes
> sense of it. Business sense. IT sense. Common sense.
> http://p.sf.net/sfu/splunk-d2dcopy1
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to