mirror of
https://github.com/zlgopen/awtk.git
synced 2025-05-08 19:44:45 +08:00
improve idle/timer
This commit is contained in:
parent
3ed0669efb
commit
77d0c9ba65
@ -1,4 +1,6 @@
|
||||
# 最新动态
|
||||
2022/09/14
|
||||
* 支持在添加idle和添加timer是指定ID(感谢智明提供补丁)
|
||||
|
||||
2022/09/11
|
||||
* widget 的虚表 only\_active\_children 属性改为 widget\_get\_only\_active\_children\_t 函数指针(感谢智明提供补丁)
|
||||
|
@ -45,7 +45,7 @@ static const object_vtable_t s_idle_info_vtable = {
|
||||
.is_collection = FALSE,
|
||||
.on_destroy = (tk_object_on_destroy_t)idle_info_on_destroy};
|
||||
|
||||
idle_info_t* idle_info_create(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx,
|
||||
idle_info_t* idle_info_create(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx,
|
||||
uint16_t idle_info_type) {
|
||||
tk_object_t* obj = tk_object_create(&s_idle_info_vtable);
|
||||
idle_info_t* idle = IDLE_INFO(obj);
|
||||
@ -56,7 +56,6 @@ idle_info_t* idle_info_create(idle_manager_t* idle_manager, idle_func_t on_idle,
|
||||
idle->idle_info_type = idle_info_type;
|
||||
|
||||
if (idle_manager != NULL) {
|
||||
uint32_t id = idle_manager_get_next_idle_id(idle_manager);
|
||||
idle->id = id;
|
||||
|
||||
if (id != TK_INVALID_ID) {
|
||||
|
@ -118,7 +118,7 @@ idle_info_t* idle_info_init_dummy_with_ctx_and_type(idle_info_t* idle, uint16_t
|
||||
void* ctx);
|
||||
ret_t idle_info_on_idle(idle_info_t* idle, uint32_t dispatch_id);
|
||||
bool_t idle_info_is_available(idle_info_t* idle, uint32_t dispatch_id);
|
||||
idle_info_t* idle_info_create(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx,
|
||||
idle_info_t* idle_info_create(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx,
|
||||
uint16_t idle_info_type);
|
||||
|
||||
#define IDLE_INFO(o) ((idle_info_t*)(o))
|
||||
|
@ -109,13 +109,31 @@ uint32_t idle_manager_add(idle_manager_t* idle_manager, idle_func_t on_idle, voi
|
||||
return idle_manager_add_with_type(idle_manager, on_idle, ctx, IDLE_INFO_NORMAL);
|
||||
}
|
||||
|
||||
uint32_t idle_manager_add_with_id(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx) {
|
||||
return idle_manager_add_with_type_and_id(idle_manager, id, on_idle, ctx, IDLE_INFO_NORMAL, TRUE);
|
||||
}
|
||||
|
||||
uint32_t idle_manager_add_with_type(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx,
|
||||
uint16_t type) {
|
||||
uint32_t id = TK_INVALID_ID;
|
||||
return_value_if_fail(idle_manager != NULL, TK_INVALID_ID);
|
||||
|
||||
id = idle_manager_get_next_idle_id(idle_manager);
|
||||
return idle_manager_add_with_type_and_id(idle_manager, id, on_idle, ctx, type, FALSE);
|
||||
}
|
||||
|
||||
uint32_t idle_manager_add_with_type_and_id(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx,
|
||||
uint16_t type, bool_t check_id) {
|
||||
idle_info_t* idle = NULL;
|
||||
return_value_if_fail(on_idle != NULL, TK_INVALID_ID);
|
||||
return_value_if_fail(idle_manager != NULL, TK_INVALID_ID);
|
||||
if (check_id) {
|
||||
if (idle_manager_find(idle_manager, id) != NULL) {
|
||||
return TK_INVALID_ID;
|
||||
}
|
||||
}
|
||||
|
||||
idle = idle_info_create(idle_manager, on_idle, ctx, type);
|
||||
idle = idle_info_create(idle_manager, id, on_idle, ctx, type);
|
||||
return_value_if_fail(idle != NULL, TK_INVALID_ID);
|
||||
|
||||
return idle->id;
|
||||
|
@ -169,9 +169,28 @@ const idle_info_t* idle_manager_find(idle_manager_t* idle_manager, uint32_t idle
|
||||
*/
|
||||
uint32_t idle_manager_add(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx);
|
||||
|
||||
/*internal use*/
|
||||
/**
|
||||
* @method idle_manager_add_with_id
|
||||
* 添加 idle(可以指定 idle_id ,如果发现 idle_id 冲突则添加失败)。
|
||||
* @param {idle_manager_t*} idle_manager idle_manager_t管理器对象。
|
||||
* @param {uint32_t} id idle_id。
|
||||
* @param {idle_func_t*} on_idle idle回调函数。
|
||||
* @param {void*} ctx idle回调函数的上下文。
|
||||
*
|
||||
* @return {uint32_t} 返回idle的ID,TK_INVALID_ID表示失败。
|
||||
*/
|
||||
uint32_t idle_manager_add_with_id(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx);
|
||||
|
||||
/**
|
||||
* @method idle_manager_get_next_idle_id
|
||||
* 获取下一个可用的 idle_id。
|
||||
* @param {idle_manager_t*} idle_manager idle_manager_t管理器对象。
|
||||
*
|
||||
* @return {uint32_t} 返回idle的ID,TK_INVALID_ID表示失败。
|
||||
*/
|
||||
uint32_t idle_manager_get_next_idle_id(idle_manager_t* idle_manager);
|
||||
|
||||
/*internal use*/
|
||||
/**
|
||||
* @method idle_manager_remove_all_by_ctx_and_type
|
||||
*/
|
||||
@ -182,6 +201,11 @@ ret_t idle_manager_remove_all_by_ctx_and_type(idle_manager_t* idle_manager, uint
|
||||
*/
|
||||
uint32_t idle_manager_add_with_type(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx,
|
||||
uint16_t type);
|
||||
/**
|
||||
* @method idle_manager_add_with_type_and_id
|
||||
*/
|
||||
uint32_t idle_manager_add_with_type_and_id(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx,
|
||||
uint16_t type, bool_t check_id);
|
||||
/**
|
||||
* @method idle_manager_exist
|
||||
*/
|
||||
|
@ -45,7 +45,7 @@ static const object_vtable_t s_timer_info_vtable = {
|
||||
.is_collection = FALSE,
|
||||
.on_destroy = (tk_object_on_destroy_t)timer_info_on_destroy};
|
||||
|
||||
timer_info_t* timer_info_create(timer_manager_t* tm, timer_func_t on_timer, void* ctx,
|
||||
timer_info_t* timer_info_create(timer_manager_t* tm, uint32_t id, timer_func_t on_timer, void* ctx,
|
||||
uint32_t duration, uint16_t timer_info_type) {
|
||||
tk_object_t* obj = tk_object_create(&s_timer_info_vtable);
|
||||
timer_info_t* timer = TIMER_INFO(obj);
|
||||
@ -58,7 +58,6 @@ timer_info_t* timer_info_create(timer_manager_t* tm, timer_func_t on_timer, void
|
||||
timer->timer_info_type = timer_info_type;
|
||||
|
||||
if (tm != NULL) {
|
||||
uint32_t id = timer_manager_get_next_timer_id(tm);
|
||||
timer->id = id;
|
||||
timer->timer_manager = tm;
|
||||
timer->start = tm->get_time();
|
||||
|
@ -151,7 +151,7 @@ int timer_info_compare_by_ctx_and_type(const void* a, const void* b);
|
||||
timer_info_t* timer_info_init_dummy(timer_info_t* timer, uint32_t id);
|
||||
timer_info_t* timer_info_init_dummy_with_ctx_and_type(timer_info_t* timer, uint16_t type,
|
||||
void* ctx);
|
||||
timer_info_t* timer_info_create(timer_manager_t* tm, timer_func_t on_timer, void* ctx,
|
||||
timer_info_t* timer_info_create(timer_manager_t* tm, uint32_t id, timer_func_t on_timer, void* ctx,
|
||||
uint32_t duration, uint16_t timer_info_type);
|
||||
|
||||
ret_t timer_info_on_timer(timer_info_t* timer, uint64_t now);
|
||||
|
@ -95,13 +95,31 @@ uint32_t timer_manager_add(timer_manager_t* timer_manager, timer_func_t on_timer
|
||||
return timer_manager_add_with_type(timer_manager, on_timer, ctx, duration, TIMER_INFO_NORMAL);
|
||||
}
|
||||
|
||||
uint32_t timer_manager_add_with_id(timer_manager_t* timer_manager, uint32_t id, timer_func_t on_timer, void* ctx,
|
||||
uint32_t duration) {
|
||||
return timer_manager_add_with_type_and_id(timer_manager, id, on_timer, ctx, duration, TIMER_INFO_NORMAL, TRUE);
|
||||
}
|
||||
|
||||
uint32_t timer_manager_add_with_type(timer_manager_t* timer_manager, timer_func_t on_timer,
|
||||
void* ctx, uint32_t duration, uint16_t timer_info_type) {
|
||||
uint32_t id = timer_manager_get_next_timer_id(timer_manager);
|
||||
return timer_manager_add_with_type_and_id(timer_manager, id, on_timer, ctx, duration, timer_info_type, FALSE);
|
||||
}
|
||||
|
||||
uint32_t timer_manager_add_with_type_and_id(timer_manager_t* timer_manager, uint32_t id, timer_func_t on_timer,
|
||||
void* ctx, uint32_t duration, uint16_t timer_info_type, bool_t is_check_id) {
|
||||
timer_info_t* timer = NULL;
|
||||
return_value_if_fail(on_timer != NULL, TK_INVALID_ID);
|
||||
return_value_if_fail(id != TK_INVALID_ID, TK_INVALID_ID);
|
||||
return_value_if_fail(timer_manager != NULL, TK_INVALID_ID);
|
||||
|
||||
timer = timer_info_create(timer_manager, on_timer, ctx, duration, timer_info_type);
|
||||
if (is_check_id) {
|
||||
if (timer_manager_find(timer_manager, id) != NULL) {
|
||||
return TK_INVALID_ID;
|
||||
}
|
||||
}
|
||||
|
||||
timer = timer_info_create(timer_manager, id, on_timer, ctx, duration, timer_info_type);
|
||||
return_value_if_fail(timer != NULL, TK_INVALID_ID);
|
||||
|
||||
return timer->id;
|
||||
|
@ -110,6 +110,20 @@ ret_t timer_manager_destroy(timer_manager_t* timer_manager);
|
||||
uint32_t timer_manager_add(timer_manager_t* timer_manager, timer_func_t on_timer, void* ctx,
|
||||
uint32_t duration);
|
||||
|
||||
/**
|
||||
* @method timer_manager_add_with_id
|
||||
* 添加定时器。(可以指定 timer_id ,如果发现 timer_id 冲突则添加失败)。
|
||||
* @param {timer_manager_t*} timer_manager 定时器管理器对象。
|
||||
* @param {uint32_t} id timer_id。
|
||||
* @param {timer_func_t*} on_timer timer回调函数。
|
||||
* @param {void*} ctx timer回调函数的上下文。
|
||||
* @param {uint32_t} duration 时间。
|
||||
*
|
||||
* @return {uint32_t} 返回timer的ID,TK_INVALID_ID表示失败。
|
||||
*/
|
||||
uint32_t timer_manager_add_with_id(timer_manager_t* timer_manager, uint32_t id, timer_func_t on_timer, void* ctx,
|
||||
uint32_t duration);
|
||||
|
||||
/**
|
||||
* @method timer_manager_remove
|
||||
* 根据id删除定时器。
|
||||
@ -186,11 +200,16 @@ uint64_t timer_manager_next_time(timer_manager_t* timer_manager);
|
||||
*/
|
||||
ret_t timer_manager_append(timer_manager_t* timer_manager, timer_info_t* timer);
|
||||
|
||||
/*internal use*/
|
||||
/**
|
||||
* @method timer_manager_get_next_timer_id
|
||||
* @method timer_manager_get_next_timer_id
|
||||
* 获取下一个可用的 timer_id。
|
||||
* @param {timer_manager_t*} timer_manager timer_manager_t管理器对象。
|
||||
*
|
||||
* @return {uint32_t} 返回idle的ID,TK_INVALID_ID表示失败。
|
||||
*/
|
||||
uint32_t timer_manager_get_next_timer_id(timer_manager_t* timer_manager);
|
||||
|
||||
/*internal use*/
|
||||
/**
|
||||
* @method timer_manager_all_remove_by_ctx_and_type
|
||||
*/
|
||||
@ -201,6 +220,11 @@ ret_t timer_manager_all_remove_by_ctx_and_type(timer_manager_t* timer_manager, u
|
||||
*/
|
||||
uint32_t timer_manager_add_with_type(timer_manager_t* timer_manager, timer_func_t on_timer,
|
||||
void* ctx, uint32_t duration, uint16_t timer_info_type);
|
||||
/**
|
||||
* @method timer_manager_add_with_type_and_id
|
||||
*/
|
||||
uint32_t timer_manager_add_with_type_and_id(timer_manager_t* timer_manager, uint32_t id, timer_func_t on_timer,
|
||||
void* ctx, uint32_t duration, uint16_t timer_info_type, bool_t is_check_id);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
|
@ -18,11 +18,16 @@ TEST(EventSourceIdle, basic) {
|
||||
ASSERT_EQ(event_source_dispatch(event_source), RET_OK);
|
||||
ASSERT_EQ(s_idle_times, 0u);
|
||||
|
||||
uint32_t id = idle_manager_get_next_idle_id(tm);
|
||||
ASSERT_EQ(id != TK_INVALID_ID, TRUE);
|
||||
ASSERT_EQ(idle_manager_add_with_id(tm, id, idle_once, NULL), id);
|
||||
ASSERT_EQ(idle_manager_add_with_id(tm, id, idle_once, NULL), TK_INVALID_ID);
|
||||
|
||||
idle_manager_add(tm, idle_once, NULL);
|
||||
ASSERT_EQ(event_source_get_wakeup_time(event_source), 0u);
|
||||
|
||||
ASSERT_EQ(event_source_dispatch(event_source), RET_OK);
|
||||
ASSERT_EQ(s_idle_times, 1u);
|
||||
ASSERT_EQ(s_idle_times, 2u);
|
||||
|
||||
tk_object_unref(TK_OBJECT(event_source));
|
||||
idle_manager_destroy(tm);
|
||||
|
@ -20,6 +20,12 @@ static ret_t timer_once(const timer_info_t* timer) {
|
||||
TEST(EventSourceTimer, basic) {
|
||||
timer_manager_t* tm = timer_manager_create(timer_get_time);
|
||||
timer_manager_add(tm, timer_once, NULL, 100);
|
||||
|
||||
uint32_t id = timer_manager_get_next_timer_id(tm);
|
||||
ASSERT_EQ(id != TK_INVALID_ID, TRUE);
|
||||
ASSERT_EQ(timer_manager_add_with_id(tm, id, timer_once, NULL, 100), id);
|
||||
ASSERT_EQ(timer_manager_add_with_id(tm, id, timer_once, NULL, 100), TK_INVALID_ID);
|
||||
|
||||
event_source_t* event_source = event_source_timer_create(tm);
|
||||
ASSERT_EQ(event_source_get_fd(event_source), -1);
|
||||
ASSERT_EQ(event_source_check(event_source), RET_OK);
|
||||
@ -29,7 +35,7 @@ TEST(EventSourceTimer, basic) {
|
||||
|
||||
timer_set_time(100);
|
||||
ASSERT_EQ(event_source_dispatch(event_source), RET_OK);
|
||||
ASSERT_EQ(s_timer_times, 1u);
|
||||
ASSERT_EQ(s_timer_times, 2u);
|
||||
|
||||
tk_object_unref(TK_OBJECT(event_source));
|
||||
timer_manager_destroy(tm);
|
||||
|
@ -11,7 +11,7 @@ static ret_t on_timer(const timer_info_t* timer) {
|
||||
|
||||
TEST(TimerInfo, basic) {
|
||||
timer_info_t dummy;
|
||||
timer_info_t* timer = timer_info_create(NULL, on_timer, NULL, 1000, TIMER_INFO_NORMAL);
|
||||
timer_info_t* timer = timer_info_create(NULL, 1, on_timer, NULL, 1000, TIMER_INFO_NORMAL);
|
||||
|
||||
ASSERT_EQ(timer->duration, 1000u);
|
||||
ASSERT_EQ(timer_info_compare_by_id(timer, timer), 0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user