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>
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;
static pthread_mutex_t th_lock;
static int th_exit = 0;
static void *
my_thread_run(void *arg)
{
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));
ecore_main_loop_thread_safe_call_async
(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;
evas_object_move(rect, inf->x - 50, inf->y - 50);
free(inf);
}
static void
down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
pthread_mutex_lock(&th_lock);
th_exit = 1;
pthread_mutex_unlock(&th_lock);
}
static void
del(void *data, Evas_Object *obj, void *event_info)
{
pthread_mutex_lock(&th_lock);
th_exit = 1;
pthread_mutex_unlock(&th_lock);
evas_object_del(obj);
}
EAPI_MAIN int
elm_main(int argc, char **argv)
{
Evas_Object *o;
evas_object_smart_callback_add(win, "delete,request", del, NULL);
o = evas_object_rectangle_add(evas_object_evas_get(win));
evas_object_color_set(o, 50, 80, 180, 255);
evas_object_resize(o, 100, 100);
evas_object_show(o);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, down, NULL);
rect = o;
my_thread_new();
evas_object_resize(win, 400, 400);
evas_object_show(win);
pthread_mutex_lock(&th_lock);
th_exit = 1;
pthread_mutex_unlock(&th_lock);
return 0;
}