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:
EFL Threading example 2
EFL Threading example 3
EFL Threading example 4
EFL Threading example 5
EFL Threading example 6
#include <Elementary.h>
#include <pthread.h>
static pthread_t thread_id;
static void *
{
double t = 0.0;
for (;;)
{
{
x = 200 + (200 * sin(t));
y = 200 + (200 * cos(t));
}
usleep(1000);
t += 0.02;
}
return NULL;
}
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
{
exit(0);
}
EAPI_MAIN int
{
rect = o;
my_thread_new();
return 0;
}
#define EINA_UNUSED
Definition: eina_types.h:339
Evas * evas_object_evas_get(const Eo *eo_obj)
Get the Evas to which this object belongs to.
Definition: evas_object_main.c:2662
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
Efl_Canvas_Object Evas_Object
Definition: Evas_Common.h:185
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
void elm_run(void)
Run Elementary's main loop.
Definition: elm_main.c:1362
#define ELM_MAIN()
macro to be used after the elm_main() function
Definition: elm_general.h:528
void evas_object_show(Evas_Object *eo_obj)
Makes the given Evas object visible.
Definition: evas_object_main.c:1814
EAPI int ecore_thread_main_loop_begin(void)
This function suspends the main loop in a know state.
Definition: ecore.c:674
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:9579
Evas_Object * evas_object_rectangle_add(Evas *e)
Adds a rectangle to the given evas.
Definition: evas_object_rectangle.c:78
EAPI int ecore_thread_main_loop_end(void)
Unlocks the main loop.
Definition: ecore.c:724
int Evas_Coord
Type used for coordinates (in pixels, int).
Definition: Evas_Common.h:116
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
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