diff --git a/src/bin/ui/ui.c b/src/bin/ui/ui.c index ce62848..0319f4e 100644 --- a/src/bin/ui/ui.c +++ b/src/bin/ui/ui.c @@ -1407,6 +1407,9 @@ evisum_ui_shutdown(Ui *ui) if (ui->thread_system) ecore_thread_cancel(ui->thread_system); + if (ui->thread_cpu) + ecore_thread_cancel(ui->thread_cpu); + if (ui->thread_process) ecore_thread_cancel(ui->thread_process); @@ -1416,6 +1419,9 @@ evisum_ui_shutdown(Ui *ui) if (ui->thread_process) ecore_thread_wait(ui->thread_process, 1.0); + if (ui->thread_cpu) + ecore_thread_wait(ui->thread_cpu, 1.0); + _proc_pid_cpu_times_free(ui); if (ui->cpu_list) @@ -1485,7 +1491,6 @@ _system_info_all_poll_feedback_cb(void *data, Ecore_Thread *thread, void *msg) if (ecore_thread_check(thread)) goto out; - ui_tab_cpu_update(ui, info); ui_tab_memory_update(ui, info); ui_tab_disk_update(ui); ui_tab_misc_update(ui, info); @@ -1547,8 +1552,9 @@ _ui_init(Evas_Object *parent) ui->sort_type = SORT_BY_PID; ui->selected_pid = -1; ui->program_pid = getpid(); - ui->disk_visible = ui->cpu_visible = EINA_TRUE; + ui->disk_visible = EINA_TRUE; ui->mem_visible = ui->misc_visible = EINA_TRUE; + ui->cpu_visible = EINA_FALSE; ui->cpu_times = NULL; ui->cpu_list = NULL; diff --git a/src/bin/ui/ui.h b/src/bin/ui/ui.h index af65ec8..026506d 100644 --- a/src/bin/ui/ui.h +++ b/src/bin/ui/ui.h @@ -83,6 +83,7 @@ typedef struct Ui Ecore_Thread *thread_system; Ecore_Thread *thread_process; + Ecore_Thread *thread_cpu; Ecore_Timer *timer_pid; pid_t selected_pid; diff --git a/src/bin/ui/ui_cpu.c b/src/bin/ui/ui_cpu.c index 2db352a..6e938f1 100644 --- a/src/bin/ui/ui_cpu.c +++ b/src/bin/ui/ui_cpu.c @@ -8,6 +8,7 @@ typedef struct { Evas_Object *line; Evas_Object *obj; Evas_Object *btn; + Ui *ui; Eina_Bool enabled; int pos; int cpu_id; @@ -45,6 +46,8 @@ animator(void *data EINA_UNUSED) Evas_Coord x, y, w, h; Animation *anim = data; + if (!anim->ui->cpu_visible) return EINA_TRUE; + bg = anim->bg; line = anim->line; obj = anim->obj; evas_object_geometry_get(bg, &x, &y, &w, &h); @@ -110,6 +113,45 @@ _btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, evas_object_color_set(rect, 47, 153, 255, 255); } +static void +_core_times_cb(void *data, Ecore_Thread *thread) +{ + Progress *progress; + cpu_core_t **cores; + Eina_List *l; + Ui *ui; + int ncpu, i; + + ui = data; + while (1) + { + if (ecore_thread_check(thread)) + break; + if (!ui->cpu_visible) + { + usleep(1000000); + continue; + } + i = 0; + cores = system_cpu_usage_get(&ncpu); + EINA_LIST_FOREACH(ui->cpu_list, l, progress) + { + if (!cores || !cores[i]) + { + ++i; + continue; + } + *progress->value = cores[i]->percent; + ecore_thread_main_loop_begin(); + elm_progressbar_value_set(progress->pb, cores[i++]->percent / 100); + ecore_thread_main_loop_end(); + } + for (i = 0; i < ncpu; i++) + free(cores[i]); + free(cores); + } +} + void ui_tab_cpu_add(Ui *ui) { @@ -215,6 +257,8 @@ ui_tab_cpu_add(Ui *ui) anim->enabled = EINA_TRUE; anim->btn = btn; anim->cpu_id = i; + anim->ui = ui; + progress->value = &anim->value; evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, anim); ecore_animator_add(animator, anim); @@ -229,24 +273,8 @@ ui_tab_cpu_add(Ui *ui) ui->cpu_list = eina_list_append(ui->cpu_list, progress); } + ui->thread_cpu = ecore_thread_run(_core_times_cb, NULL, NULL, ui); + elm_box_pack_end(hbox, box); } -void -ui_tab_cpu_update(Ui *ui, Sys_Info *info) -{ - Eina_List *l; - Progress *progress; - int i = 0; - - if (!ui->cpu_visible) - return; - - EINA_LIST_FOREACH(ui->cpu_list, l, progress) - { - *progress->value = info->cores[i]->percent; - elm_progressbar_value_set(progress->pb, info->cores[i]->percent / 100); - ++i; - } -} - diff --git a/src/bin/ui/ui_cpu.h b/src/bin/ui/ui_cpu.h index 6a29c9d..e69fe7d 100644 --- a/src/bin/ui/ui_cpu.h +++ b/src/bin/ui/ui_cpu.h @@ -7,8 +7,4 @@ void ui_tab_cpu_add(Ui *ui); -void -ui_tab_cpu_update(Ui *ui, Sys_Info *info); - - #endif