EFL UI基本上只在一個線程上工作在主循環上。
所以EFL系統無法繪製用戶界面,除非您在事件功能中完成了一些工作。
您可以爲您的作業創建另一個線程並在事件函數中啓動線程。
但使用ecore閒置函數來使用eext_circle_object_value_set。
大部分EFL和tizen函數都必須在主線程中使用。
因此,在另一個線程中運行你的工作,並使用ecore主循環函數向主線程請求進程值設置器。
EFL Ecore爲主循環提供請求作業的同步和異步功能。 ecore_main_loop_thread_safe_call_async
和 ecore_main_loop_thread_safe_call_sync
可以用來代替ecore_idle功能。
所以這裏是簡單的例子有初等進展。 我不使用埃克斯特功能在此源代碼,但你可以參考的elm_progressbar_value_set代替埃克斯特。
#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;
}
您能否詳細說明在UI中需要哪些類型的更改?您在UI Builder - 導航和用戶界面生成器 - 單一視圖之間使用了哪種版本的本地用戶界面生成器? –
在我用來更新progessbar值的例子中。它也不適用於更新標籤文本。在方法結束時我只看到最終結果。我使用最新版本的本機UI建設者單一視圖 – BorisT
我想你創建一個圓進度。所以首先你需要創建一個圓形進度條。 您可以使用「eext_circle_object_progressbar_add()」函數創建圓形進度條。 在使用圓形進度條之前,使用「eext_circle_object_value_min_max_set()」函數設置其最小值和最大值。 –