awtk/demos/demo_thread_app.c

111 lines
2.5 KiB
C
Raw Normal View History

2018-05-18 17:42:13 +08:00
/**
* File: demo1_app.c
* Author: AWTK Develop Team
* Brief: basic class of all widget
*
2020-01-01 11:27:36 +08:00
* Copyright (c) 2018 - 2020 Guangzhou ZHIYUAN Electronics Co.,Ltd.
2018-05-18 17:42:13 +08:00
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2018-02-16 Li XianJing <xianjimli@hotmail.com> created
*
*/
#include "base/idle.h"
#include "base/timer.h"
#include "base/enums.h"
#include "widgets/label.h"
#include "widgets/button.h"
#include "tkc/thread.h"
#include "tkc/platform.h"
#include "tkc/mem.h"
#include "tkc/utils.h"
#include "tkc/utf8.h"
#include "base/window.h"
2018-05-18 17:42:13 +08:00
#include "base/image_manager.h"
#include "widgets/progress_bar.h"
2018-05-18 17:42:13 +08:00
2019-12-29 12:24:16 +08:00
static ret_t update_label(widget_t* label) {
2019-12-29 15:16:59 +08:00
char str[64];
2019-12-29 12:24:16 +08:00
static int times = 0;
2019-12-29 15:16:59 +08:00
mem_stat_t st = tk_mem_stat();
tk_snprintf(str, sizeof(str), "times:%d mem(%u,%u)", times++, st.used_bytes, st.used_block_nr);
2019-12-29 12:24:16 +08:00
widget_set_text_utf8(label, str);
return RET_OK;
}
static ret_t on_timer(const timer_info_t* timer) {
return update_label(WIDGET(timer->ctx));
}
2018-05-18 17:42:13 +08:00
static ret_t update_progress_bar(widget_t* progress_bar) {
static bool_t inc = TRUE;
int value = widget_get_value(progress_bar);
2018-05-20 16:35:56 +08:00
if (inc) {
2018-05-18 17:42:13 +08:00
widget_set_value(progress_bar, ++value);
} else {
widget_set_value(progress_bar, --value);
}
2018-05-20 16:35:56 +08:00
if (value > 99) {
2018-05-18 17:42:13 +08:00
inc = FALSE;
2018-05-20 16:35:56 +08:00
} else if (value < 1) {
2018-05-18 17:42:13 +08:00
inc = TRUE;
}
return RET_OK;
}
2018-06-03 10:19:34 +08:00
static ret_t on_idle(const idle_info_t* idle) {
2018-06-16 11:40:13 +08:00
return update_progress_bar(WIDGET(idle->ctx));
2018-06-03 10:19:34 +08:00
}
2018-05-18 17:42:13 +08:00
2019-12-29 12:24:16 +08:00
void* test_idle_queue(void* args) {
2019-12-29 15:16:59 +08:00
int nr = 500000;
2018-05-20 16:35:56 +08:00
while (nr-- > 0) {
2018-05-18 17:42:13 +08:00
idle_queue(on_idle, args);
2019-12-29 12:24:16 +08:00
sleep_ms(30);
}
return NULL;
}
void* test_timer_queue(void* args) {
2019-12-29 15:16:59 +08:00
int nr = 500000;
2019-12-29 12:24:16 +08:00
while (nr-- > 0) {
2018-05-18 17:42:13 +08:00
timer_queue(on_timer, args, 30);
sleep_ms(30);
}
return NULL;
}
ret_t application_init() {
2019-05-06 16:35:51 +08:00
tk_thread_t* thread = NULL;
2018-05-18 17:42:13 +08:00
widget_t* progress_bar = NULL;
widget_t* win = window_create(NULL, 0, 0, 0, 0);
widget_t* label = label_create(win, 10, 10, 300, 20);
widget_set_text(label, L"Update progressbar in non GUI thread");
progress_bar = progress_bar_create(win, 10, 80, 300, 20);
2019-12-29 12:24:16 +08:00
thread = tk_thread_create(test_idle_queue, progress_bar);
tk_thread_start(thread);
2019-12-30 07:31:04 +08:00
2019-12-29 12:24:16 +08:00
thread = tk_thread_create(test_timer_queue, label);
2019-05-06 16:35:51 +08:00
tk_thread_start(thread);
2018-05-18 17:42:13 +08:00
return RET_OK;
}