You can also use the ecore\+\_\+thread infrastructure for compute tasks that don\textquotesingle{}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 \char`\"{}display them\char`\"{}.


\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{\textcolor{comment}{//Compile with:}}
\DoxyCodeLine{\textcolor{comment}{//gcc -\/o efl\_thread\_6 efl\_thread\_6.c -\/g `pkg-\/config -\/-\/cflags -\/-\/libs elementary`}}
\DoxyCodeLine{\textcolor{preprocessor}{\#include <Elementary.h>}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static} \mbox{\hyperlink{group__Evas__Object__Group_ga9e19e6dd1f517a0ba437c0114d3e7c97}{Evas\_Object}} *win = NULL;}
\DoxyCodeLine{\textcolor{keyword}{static} \mbox{\hyperlink{struct__Eina__List}{Eina\_List}} *threads;}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{struct }info}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Evas__Object__Group_ga9e19e6dd1f517a0ba437c0114d3e7c97}{Evas\_Object}} *obj;}
\DoxyCodeLine{   \textcolor{keywordtype}{int} *pix;}
\DoxyCodeLine{\};}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{// BEGIN -\/ code running in my custom thread instance}}
\DoxyCodeLine{\textcolor{comment}{//}}
\DoxyCodeLine{\textcolor{keyword}{static} \textcolor{keywordtype}{void}}
\DoxyCodeLine{mandel(\mbox{\hyperlink{group__Ecore__Thread__Group_ga0c2e1f8d562ccf80ecc0009ada72496f}{Ecore\_Thread}} *th, \textcolor{keywordtype}{int} *pix, \textcolor{keywordtype}{int} w, \textcolor{keywordtype}{int} h)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \textcolor{keywordtype}{double} x, xx, y, cx, cy, cox, coy;}
\DoxyCodeLine{   \textcolor{keywordtype}{int} iteration, hx, hy, val, r, g, b, rr, gg, bb;}
\DoxyCodeLine{   \textcolor{keywordtype}{int} itermax = 10000;}
\DoxyCodeLine{   \textcolor{keywordtype}{double} magnify = 0.02;}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// this mandel calc is run in the worker threads so it's here. it is}}
\DoxyCodeLine{   \textcolor{comment}{// just here to calculate something and consume cpu to demonstrate the}}
\DoxyCodeLine{   \textcolor{comment}{// ecore thread worker queue. don't pay much attention to the below code}}
\DoxyCodeLine{   magnify += ((double)(rand() \% 100) / 100.0) / 4.0;}
\DoxyCodeLine{   cox = (double)(rand() \% 100) / 100.0;}
\DoxyCodeLine{   coy = (double)(rand() \% 100) / 100.0;}
\DoxyCodeLine{   cox /= (magnify * 3.0);}
\DoxyCodeLine{   r = rand() \% 255; g = rand() \% 255; b = rand() \% 255;}
\DoxyCodeLine{   \textcolor{keywordflow}{for} (hy = 0; hy < h; hy++)}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        \textcolor{comment}{// every line check if thread has been cancelled to return early}}
\DoxyCodeLine{        \textcolor{keywordflow}{if} (\mbox{\hyperlink{group__Ecore__Thread__Group_ga792471a7ed00718b71d58b791ddbd08d}{ecore\_thread\_check}}(th)) \textcolor{keywordflow}{return};}
\DoxyCodeLine{        \textcolor{keywordflow}{for} (hx = 0; hx < w; hx++)}
\DoxyCodeLine{          \{}
\DoxyCodeLine{             cx = (((float)hx) / ((float)w) -\/ 0.5) / (magnify * 3.0);}
\DoxyCodeLine{             cy = (((float)hy) / ((float)h) -\/ 0.5) / (magnify * 3.0);}
\DoxyCodeLine{             cx += cox;}
\DoxyCodeLine{             cy += coy;}
\DoxyCodeLine{             x = 0.0;}
\DoxyCodeLine{             y = 0.0;}
\DoxyCodeLine{             \textcolor{keywordflow}{for} (iteration = 1; iteration < itermax; iteration++)}
\DoxyCodeLine{               \{}
\DoxyCodeLine{                  xx = (x * x) -\/ (y * y) + cx;}
\DoxyCodeLine{                  y = (2.0 * x * y) + cy;}
\DoxyCodeLine{                  x = xx;}
\DoxyCodeLine{                  \textcolor{keywordflow}{if} (((x * x) + (y * y)) > 100.0) iteration = 999999;}
\DoxyCodeLine{               \}}
\DoxyCodeLine{             val = (((x * x) + (y * y)) * 2.55) / 100.0;}
\DoxyCodeLine{             \textcolor{keywordflow}{if} (val > 255) val = 255;}
\DoxyCodeLine{             \textcolor{keywordflow}{if} (iteration >= 99999)}
\DoxyCodeLine{               \{}
\DoxyCodeLine{                  rr = (r * val) / 255;}
\DoxyCodeLine{                  gg = (g * val) / 255;}
\DoxyCodeLine{                  bb = (b * val) / 255;}
\DoxyCodeLine{                  pix[(hy * w) + hx] =}
\DoxyCodeLine{                     (val  << 24) | (rr << 16) | (gg << 8) | (bb);}
\DoxyCodeLine{               \}}
\DoxyCodeLine{             \textcolor{keywordflow}{else}}
\DoxyCodeLine{               pix[(hy * w) + hx] = 0xffffffff;}
\DoxyCodeLine{          \}}
\DoxyCodeLine{     \}}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static} \textcolor{keywordtype}{void}}
\DoxyCodeLine{th\_do(\textcolor{keywordtype}{void} *data, \mbox{\hyperlink{group__Ecore__Thread__Group_ga0c2e1f8d562ccf80ecc0009ada72496f}{Ecore\_Thread}} *th)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \textcolor{keyword}{struct }info *inf = data;}
\DoxyCodeLine{   \textcolor{comment}{// CANNOT TOUCH inf-\/>obj here! just inf-\/>pix which is 256x256 @ 32bpp}}
\DoxyCodeLine{   \textcolor{comment}{// quick and dirty to consume some cpu -\/ do a mandelbrot calc}}
\DoxyCodeLine{   mandel(th, inf-\/>pix, 256, 256);}
\DoxyCodeLine{\}}
\DoxyCodeLine{\textcolor{comment}{//}}
\DoxyCodeLine{\textcolor{comment}{// END -\/ code running in my custom thread instance}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static} \textcolor{keywordtype}{void} \textcolor{comment}{// thread job finished -\/ collect results and put in img obj}}
\DoxyCodeLine{th\_end(\textcolor{keywordtype}{void} *data, \mbox{\hyperlink{group__Ecore__Thread__Group_ga0c2e1f8d562ccf80ecc0009ada72496f}{Ecore\_Thread}} *th)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \textcolor{keyword}{struct }info *inf = data;}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// copy data to object, free calculated data and info struc}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Evas__Image_ga25fd768471b79fbfd3cf12c80a657e8a}{evas\_object\_image\_data\_copy\_set}}(inf-\/>obj, inf-\/>pix);}
\DoxyCodeLine{   \mbox{\hyperlink{group__Evas__Object__Group__Basic_ga07208fcafd4739de606bc35fff684bf5}{evas\_object\_show}}(inf-\/>obj);}
\DoxyCodeLine{   free(inf-\/>pix);}
\DoxyCodeLine{   free(inf);}
\DoxyCodeLine{   threads = \mbox{\hyperlink{group__Eina__List__Group_ga6e81c26272c54177d087b29c965af4d8}{eina\_list\_remove}}(threads, th);}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static} \textcolor{keywordtype}{void} \textcolor{comment}{// if the thread is cancelled -\/ free pix, keep obj tho}}
\DoxyCodeLine{th\_cancel(\textcolor{keywordtype}{void} *data, \mbox{\hyperlink{group__Ecore__Thread__Group_ga0c2e1f8d562ccf80ecc0009ada72496f}{Ecore\_Thread}} *th \mbox{\hyperlink{group__Eina__Types__Group_ga82d751be730f849719ca292f9558be87}{EINA\_UNUSED}})}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \textcolor{keyword}{struct }info *inf = data;}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// just free pixel data and info struct}}
\DoxyCodeLine{   free(inf-\/>pix);}
\DoxyCodeLine{   free(inf);}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static} \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}} \textcolor{comment}{// animate the objects so you see all the madels move}}
\DoxyCodeLine{anim(\textcolor{keywordtype}{void} *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Evas__Object__Group_ga9e19e6dd1f517a0ba437c0114d3e7c97}{Evas\_Object}} *o = data;}
\DoxyCodeLine{   \textcolor{keywordtype}{double} t, z;}
\DoxyCodeLine{   \textcolor{keywordtype}{int} w, h, v;}
\DoxyCodeLine{   \mbox{\hyperlink{Evas__Common_8h_a2453e92182bad3b0e0d84e5aff433b07}{Evas\_Coord}} x, y;}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// just calculate some position using the pointer value of the object as}}
\DoxyCodeLine{   \textcolor{comment}{// a seed value to make different objects go into different places over time}}
\DoxyCodeLine{   v = ((int)(uintptr\_t)o) \& 0xff;}
\DoxyCodeLine{   t = \mbox{\hyperlink{group__Ecore__Time__Group_gab53d952cc4c2f3ed032d535b307c43bd}{ecore\_loop\_time\_get}}();}
\DoxyCodeLine{   w = 100 + ((v * 100) >> 8);}
\DoxyCodeLine{   h = 100 + ((v * 100) >> 8);}
\DoxyCodeLine{   z = (double)(v) / 100.0;}
\DoxyCodeLine{   x = (w * sin(t));}
\DoxyCodeLine{   y = (h * cos(t + z));}
\DoxyCodeLine{   \textcolor{comment}{// do the actual move}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Evas__Object__Group_ga335c8ee6eaeaac9710656af4f8b0db91}{evas\_object\_move}}(o, 200 + x -\/ 128, 200 + y -\/ 128);}
\DoxyCodeLine{   \textcolor{comment}{// keep looping -\/ return true}}
\DoxyCodeLine{   \textcolor{keywordflow}{return} \mbox{\hyperlink{group__Eina__Types__Group_ga05c12dacc8b4058994df842b41be85fc}{EINA\_TRUE}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{EAPI\_MAIN \textcolor{keywordtype}{int}}
\DoxyCodeLine{elm\_main(\textcolor{keywordtype}{int} argc \mbox{\hyperlink{group__Eina__Types__Group_ga82d751be730f849719ca292f9558be87}{EINA\_UNUSED}}, \textcolor{keywordtype}{char} **argv \mbox{\hyperlink{group__Eina__Types__Group_ga82d751be730f849719ca292f9558be87}{EINA\_UNUSED}})}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Evas__Object__Group_ga9e19e6dd1f517a0ba437c0114d3e7c97}{Evas\_Object}} *o;}
\DoxyCodeLine{   \mbox{\hyperlink{group__Ecore__Thread__Group_ga0c2e1f8d562ccf80ecc0009ada72496f}{Ecore\_Thread}} *th;}
\DoxyCodeLine{   \textcolor{keywordtype}{int} i;}
\DoxyCodeLine{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Elm__General_ga7a05f37fd3a019da5e26c5fc91fcd937}{elm\_policy\_set}}(\mbox{\hyperlink{group__Elm__General_ggaa16f3378ecdbf660fa378402e3c5a0a9a02fadb6faada04b19d0fa42c11a8d32a}{ELM\_POLICY\_QUIT}}, \mbox{\hyperlink{group__Elm__General_gga46af37e6ac2c406321060be827117196abbe0962d88ae12afe1a173da881f56cd}{ELM\_POLICY\_QUIT\_LAST\_WINDOW\_CLOSED}});}
\DoxyCodeLine{}
\DoxyCodeLine{   win = \mbox{\hyperlink{group__Elm__Win__Group_ga23d9d1ffa0a65a1a1dd482d570db1ba0}{elm\_win\_util\_standard\_add}}(\textcolor{stringliteral}{"{}efl-\/thread-\/6"{}}, \textcolor{stringliteral}{"{}EFL Thread 6"{}});}
\DoxyCodeLine{   \mbox{\hyperlink{group__Elm__Win__Group_ga9a16a2f8c9fd5b6e9203ed9dcb53ea8b}{elm\_win\_autodel\_set}}(win, \mbox{\hyperlink{group__Eina__Types__Group_ga05c12dacc8b4058994df842b41be85fc}{EINA\_TRUE}});}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// queue up 64 mandel generation thread jobs}}
\DoxyCodeLine{   \textcolor{keywordflow}{for} (i = 0; i < 64; i++)}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        \textcolor{keyword}{struct }info *inf;}
\DoxyCodeLine{}
\DoxyCodeLine{        \textcolor{comment}{// create ecore thread to do some threaded job inside the worker pool}}
\DoxyCodeLine{        inf = malloc(\textcolor{keyword}{sizeof}(\textcolor{keyword}{struct} info));}
\DoxyCodeLine{        \textcolor{keywordflow}{if} (inf)}
\DoxyCodeLine{          \{}
\DoxyCodeLine{             o = \mbox{\hyperlink{group__Evas__Object__Image_gafb52be265f315186a28d43af2d559ec6}{evas\_object\_image\_filled\_add}}(\mbox{\hyperlink{group__Evas__Object__Group_ga7e211219d11abced5f3089362f7476b9}{evas\_object\_evas\_get}}(win));}
\DoxyCodeLine{             \mbox{\hyperlink{group__Evas__Object__Image_ga4bef461d2edd675516ec8460a4c62e8d}{evas\_object\_image\_size\_set}}(o, 256, 256);}
\DoxyCodeLine{             \mbox{\hyperlink{group__Evas__Object__Image_gaa1e3f5ae99f547f9fe8cc5c55727dad2}{evas\_object\_image\_alpha\_set}}(o, \mbox{\hyperlink{group__Eina__Types__Group_ga05c12dacc8b4058994df842b41be85fc}{EINA\_TRUE}});}
\DoxyCodeLine{             \mbox{\hyperlink{group__Evas__Object__Group_gacad94595f83580c18908cb3b69b08d1a}{evas\_object\_resize}}(o, 256, 256);}
\DoxyCodeLine{             inf-\/>obj = o;}
\DoxyCodeLine{             inf-\/>pix = malloc(256 * 256 * \textcolor{keyword}{sizeof}(\textcolor{keywordtype}{int}));}
\DoxyCodeLine{             th = \mbox{\hyperlink{group__Ecore__Thread__Group_ga6857d9e5bd717ae3d8417b39ec585c3f}{ecore\_thread\_run}}(th\_do, th\_end, th\_cancel, inf);}
\DoxyCodeLine{             threads = \mbox{\hyperlink{group__Eina__List__Group_ga625698a383dda8fc0db245a1c7608c49}{eina\_list\_append}}(threads, th);}
\DoxyCodeLine{             \textcolor{comment}{// bonus -\/ slide the objects around all the time with an}}
\DoxyCodeLine{             \textcolor{comment}{// animator that ticks off every frame.}}
\DoxyCodeLine{             \mbox{\hyperlink{group__Ecore__Animator__Group_ga0eca52138288075de4487d31dd3942ff}{ecore\_animator\_add}}(anim, o);}
\DoxyCodeLine{          \}}
\DoxyCodeLine{     \}}
\DoxyCodeLine{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Evas__Object__Group_gacad94595f83580c18908cb3b69b08d1a}{evas\_object\_resize}}(win, 400, 400);}
\DoxyCodeLine{   \mbox{\hyperlink{group__Evas__Object__Group__Basic_ga07208fcafd4739de606bc35fff684bf5}{evas\_object\_show}}(win);}
\DoxyCodeLine{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Elm__General_gadf2553f83e6b0b9c7fbe054019a664a1}{elm\_run}}();}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// if some threads are still running -\/ cancel them}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__List__Group_gae27a2c686a0a11693f9b06957c9bba83}{EINA\_LIST\_FREE}}(threads, th) \mbox{\hyperlink{group__Ecore__Thread__Group_gae9b9b20e1ed53c62c51617b55aed2511}{ecore\_thread\_cancel}}(th);}
\DoxyCodeLine{}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{keywordflow}{return} 0;}
\DoxyCodeLine{\}}
\DoxyCodeLine{\mbox{\hyperlink{group__Elm__General_ga50fe52d513f7e89c9c770afd76de7ad9}{ELM\_MAIN}}()}

\end{DoxyCodeInclude}
 