EFL UI arbeitet bascially auf Hauptschleife mit nur einem Thread: zum Beispiel Fortschrittsbalken wie auf diese Schaltfläche Click-Handler gezeigt ändern.
So kann das EFL-System die Benutzeroberfläche erst zeichnen, wenn Sie einen Job in Ihrer Ereignisfunktion beendet haben.
Sie können einen anderen Thread für Ihren Job erstellen und Thread in der Ereignisfunktion starten.
Verwenden Sie jedoch ecore-Leerlauffunktionen zur Verwendung von eext_circle_object_value_set.
Die meisten EFL- und tizen-Funktionen müssen im Hauptthread verwendet werden.
Führen Sie also Ihren Job in einem anderen Thread aus und fordern Sie einen Fortschrittswert-Setter für den Hauptthread mit ecore-Hauptschleifenfunktionen an.
EFL Ecore Versorgung Sync und Async-Funktion für Anfrage Job zu Hauptschleife. ecore_main_loop_thread_safe_call_async
und ecore_main_loop_thread_safe_call_sync
können anstelle von ecore_idle-Funktionen verwendet werden.
so hier ist ein einfaches Beispiel mit Elementary Fortschritte. Ich benutze keine eext-Funktionen in dieser Quelle, aber Sie können elm_progressbar_value_set anstelle von eext beziehen.
#include <Elementary.h>
struct progresses
{
Evas_Object *moving;
Evas_Object *status;
};
struct progress_with_value
{
Evas_Object *progress;
double value;
};
static void* progress_setter_async(void *data)
{
struct progress_with_value *pv = data;
elm_progressbar_value_set(pv->progress, pv->value);
return NULL;
}
static void some_job_cb(void *data, Ecore_Thread *thread)
{
int i=0;
struct progresses *p = data;
struct progress_with_value pv_moving = {p->moving, 0.0};
struct progress_with_value pv_status = {p->status, 0.0};
ecore_main_loop_thread_safe_call_sync(progress_setter_async, &pv_moving);
ecore_main_loop_thread_safe_call_sync(progress_setter_async, &pv_status);
while (i++<=10)
{
usleep(200000);
pv_moving.value = i * 0.1;
ecore_main_loop_thread_safe_call_sync(progress_setter_async, &pv_moving);
}
pv_status.value = 1.0;
ecore_main_loop_thread_safe_call_sync(progress_setter_async, &pv_status);
}
static void on_clicked_cb(void *data, Evas_Object *obj, void *event_info)
{
ecore_thread_run(some_job_cb, NULL, NULL, data);
}
int main(int argc, char* argv[])
{
Evas_Object *win;
elm_init(argc, argv);
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
win = elm_win_add(NULL, "sample", ELM_WIN_BASIC);
elm_win_title_set(win, "Sample");
elm_win_autodel_set(win, EINA_TRUE);
evas_object_resize(win, 800, 600);
evas_object_show(win);
Evas_Object *box = elm_box_add(win);
evas_object_resize(box, 800, 600);
evas_object_show(box);
Evas_Object *btn = elm_button_add(win);
elm_object_text_set(btn, "Start Progress 0.0 to 1.0");
evas_object_show(btn);
elm_box_pack_end(box, btn);
Evas_Object *wheel = elm_progressbar_add(win);
elm_object_style_set(wheel, "wheel");
elm_progressbar_pulse_set(wheel, EINA_TRUE);
elm_progressbar_pulse(wheel, EINA_TRUE);
evas_object_show(wheel);
elm_box_pack_end(box, wheel);
struct progresses p;
p.moving = elm_progressbar_add(win);
p.status = elm_progressbar_add(win);
evas_object_show(p.moving);
evas_object_show(p.status);
evas_object_size_hint_align_set(p.moving, EVAS_HINT_FILL, 0.5);
evas_object_size_hint_align_set(p.status, EVAS_HINT_FILL, 0.5);
elm_box_pack_end(box, p.moving);
elm_box_pack_end(box, p.status);
evas_object_smart_callback_add(btn, "clicked", on_clicked_cb, &p);
elm_run();
elm_shutdown();
return 0;
}
Können Sie bitte ausführlich erklären, welche Art von Änderungen Sie in UI benötigen? Welche Version von Native UI Builder haben Sie zwischen UI-Erstellung - Navigation und UI-Erstellung - Einzelansicht verwendet? –
im Beispiel habe ich progessbar Wert aktualisiert. Es funktioniert auch nicht zum Aktualisieren von Etikettentext. Am Ende der Methode sehe ich nur das Endergebnis. Ich verwende den nativen UI-Builder der neuesten Version mit Einzelansicht – BorisT
Ich denke, Sie erstellen einen Kreis Fortschrittsbalken. Zuerst müssen Sie eine Kreis-Fortschrittsleiste erstellen. Sie können den Kreis Fortschrittsbalken erstellen, indem Sie die Funktion "eext_circle_object_progressbar_add()" verwenden. Bevor Sie die Kreis-Fortschrittsleiste verwenden, legen Sie ihre minimalen und maximalen Werte mit der Funktion "eext_circle_object_value_min_max_set()" fest. –