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.

EFL Threading example 3

EFL Threading example 4

EFL Threading example 5

EFL Threading example 6

//Compile with:
//gcc -o efl_thread_2 efl_thread_2.c -g `pkg-config --cflags --libs elementary`
#include <Elementary.h>
#include <pthread.h>
static Evas_Object *win = NULL;
static Evas_Object *rect = NULL;
struct info
{
double x, y;
};
static void *my_thread_mainloop_code(void *data);
static pthread_t thread_id;
// BEGIN - code running in my custom pthread instance
//
static void *
my_thread_run(void *arg EINA_UNUSED)
{
double t = 0.0;
for (;;)
{
struct info *inf = malloc(sizeof(struct info));
if (inf)
{
inf->x = 200 + (200 * sin(t));
inf->y = 200 + (200 * cos(t));
(my_thread_mainloop_code, inf);
}
// and sleep and loop
usleep(1000);
t += 0.02;
}
return NULL;
}
//
// END - code running in my custom pthread instance
static void
my_thread_new(void)
{
pthread_attr_t attr;
if (pthread_attr_init(&attr) != 0)
perror("pthread_attr_init");
if (pthread_create(&thread_id, &attr, my_thread_run, NULL) != 0)
perror("pthread_create");
}
static void *
my_thread_mainloop_code(void *data)
{
struct info *inf = data;
evas_object_move(rect, inf->x - 50, inf->y - 50);
free(inf);
return NULL;
}
// on window delete - cancel thread then delete window and exit mainloop
static void
del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
exit(0);
}
EAPI_MAIN int
elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
{
win = elm_win_util_standard_add("efl-thread-2", "EFL Thread 2");
evas_object_smart_callback_add(win, "delete,request", del, NULL);
evas_object_color_set(o, 50, 80, 180, 255);
evas_object_resize(o, 100, 100);
rect = o;
// create custom thread to do some "work on the side"
my_thread_new();
evas_object_resize(win, 400, 400);
return 0;
}
EAPI void * ecore_main_loop_thread_safe_call_sync(Ecore_Data_Cb callback, void *data)
Calls callback synchronously in the main loop.
Definition: ecore.c:637
#define EINA_UNUSED
Used to indicate that a function parameter is purposely unused.
Definition: eina_types.h:339
#define ELM_MAIN()
macro to be used after the elm_main() function
Definition: elm_general.h:556
void elm_run(void)
Run Elementary's main loop.
Definition: elm_main.c:1357
Evas_Object * elm_win_util_standard_add(const char *name, const char *title)
Adds a window object with standard setup.
Definition: efl_ui_win.c:9582
EVAS_API void evas_object_show(Evas_Object *eo_obj)
Makes the given Evas object visible.
Definition: evas_object_main.c:1814
EVAS_API void evas_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
Sets the general/main color of the given Evas object to the given one.
Definition: evas_object_main.c:2024
EVAS_API void evas_object_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
Move the given Evas object to the given location inside its canvas' viewport.
Definition: evas_object_main.c:1171
EVAS_API Evas * evas_object_evas_get(const Eo *eo_obj)
Get the Evas to which this object belongs to.
Definition: evas_object_main.c:2662
Efl_Canvas_Object Evas_Object
An Evas Object handle.
Definition: Evas_Common.h:185
EVAS_API void evas_object_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
Changes the size of the given Evas object.
Definition: evas_object_main.c:1236
EVAS_API Evas_Object * evas_object_rectangle_add(Evas *e)
Adds a rectangle to the given evas.
Definition: evas_object_rectangle.c:78
EVAS_API void evas_object_smart_callback_add(Evas_Object *eo_obj, const char *event, Evas_Smart_Cb func, const void *data)
Add (register) a callback function to the smart event specified by event on the smart object obj.
Definition: evas_object_smart.c:1040