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.
#include <Elementary.h>
#include <pthread.h>
struct info
{
double x, y;
};
static void my_thread_mainloop_code(void *data);
static pthread_t thread_id;
static pthread_mutex_t th_lock;
static int th_exit = 0;
static void *
{
double t = 0.0;
for (;;)
{
struct info *inf = malloc(sizeof(struct info));
int do_exit;
if (inf)
{
inf->x = 200 + (200 * sin(t));
inf->y = 200 + (200 * cos(t));
(my_thread_mainloop_code, inf);
}
usleep(1000);
t += 0.02;
pthread_mutex_lock(&th_lock);
do_exit = th_exit;
pthread_mutex_unlock(&th_lock);
if (do_exit) break;
}
return NULL;
}
static void
my_thread_new(void)
{
pthread_attr_t attr;
pthread_mutex_init(&th_lock, NULL);
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;
free(inf);
}
static void
{
pthread_mutex_lock(&th_lock);
th_exit = 1;
pthread_mutex_unlock(&th_lock);
}
static void
{
pthread_mutex_lock(&th_lock);
th_exit = 1;
pthread_mutex_unlock(&th_lock);
}
EAPI_MAIN int
{
rect = o;
my_thread_new();
pthread_mutex_lock(&th_lock);
th_exit = 1;
pthread_mutex_unlock(&th_lock);
return 0;
}
@ EVAS_CALLBACK_MOUSE_DOWN
Mouse Button Down Event.
Definition Evas_Common.h:422
EAPI void ecore_main_loop_thread_safe_call_async(Ecore_Cb callback, void *data)
Calls callback asynchronously in the main loop.
Definition ecore.c:612
#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
Eina_Bool elm_policy_set(unsigned int policy, int value)
Set a new policy's value (for a given policy group/identifier).
Definition elm_main.c:1380
void elm_exit(void)
Ask to exit Elementary's main loop.
Definition elm_main.c:1373
void elm_run(void)
Run Elementary's main loop.
Definition elm_main.c:1357
@ ELM_POLICY_QUIT_LAST_WINDOW_CLOSED
quit when the application's last window is closed
Definition elm_general.h:248
@ ELM_POLICY_QUIT
under which circumstances the application should quit automatically.
Definition elm_general.h:227
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
Eo Evas
An opaque handle to an Evas canvas.
Definition Evas_Common.h:163
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_del(Evas_Object *obj)
Marks the given Evas object for deletion (when Evas will free its memory).
Definition evas_object_main.c:928
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_event_callback_add(Evas_Object *eo_obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
Add (register) a callback function to a given Evas object event.
Definition evas_callbacks.c:478
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