Doubango runnable笔记
下面是关于runnable的测试用例,解释了runnable的使用方法。runnable实现了这样一种机制: 启动runnable后,即启动一个线程,在线程运行上下文中处理放入runnable中的链表中的对象。 放入对象的线程上下文是调用runnable的线程(一般是主线程)。其中,runnable有个属性important, 意思就是:
“if yes, the thread will not be joined until all data in the queue have been consumed. default value: tsk_false”
#ifndef _TEST_RUNNABLE_H_
#define _TEST_RUNNABLE_H_
typedef struct test_runnable_timer_s
{
tsk_timer_id_t id;
uint64_t timeout;
const char *arg;
}
test_runnable_timer_t;
test_runnable_timer_t runnable_timers[] =
{
{0, 2000, "3"},
{1, 2500, "4"},
{2, 500, "1"},
{3, 1000, "2"},
{4, 1000, "2"},
{5, 0, "0"},
{6, 10000, "6"},
{7, 3000, "5"},
{8, 2500, "4"},
};
// 对象声明,该对象作为runnable处理的对象,被放入runnable内的链表中
typedef struct tsk_obj_s
{
TSK_DECLARE_OBJECT;
tsk_timer_id_t timer_id;
}
tsk_obj_t;
static void* tsk_obj_ctor(void * self, va_list * app){tsk_obj_t *obj = self;if(obj){obj->timer_id = va_arg(*app, tsk_timer_id_t);}return self;}static void* tsk_obj_dtor(void * self) { return self; }static int tsk_obj_cmp(const void *obj1, const void *obj2){ return 0;}// 对象定义类需要的构造函数、析构函数、比较函数等,参见Doubango的C语言实现对象式编程原理
// 对象定义类声明 static const tsk_object_def_t tsk_obj_def_s = { sizeof(tsk_obj_t), tsk_obj_ctor, tsk_obj_dtor, tsk_obj_cmp, }; const tsk_object_def_t *tsk_obj_def_t = &tsk_obj_def_s;
// runable的执行函数 void *run(void* self) { int i = 0; tsk_list_item_t *curr;
// 这里开始进行循环,等待信号灯(通过这种方式可以将链表中对象全部处理完) TSK_RUNNABLE_RUN_BEGIN(self);
// 从链表中取出对象,进行处理(这里只是打印),释放对象 if(curr = TSK_RUNNABLE_POP_FIRST(self)){ const tsk_obj_t *obj = (const tsk_obj_t*)curr->data; printf("\n\nRunnable event-id===>[%llu]\n\n", obj->timer_id); tsk_object_unref(curr); } // 循环结束 TSK_RUNNABLE_RUN_END(self); return 0; }
// 定时器回调函数,将timer_id放入runnable对象中的链表中
static int test_runnable_timer_callback(const void* arg, tsk_timer_id_t timer_id) { const tsk_runnable_t* runnable = arg; if(runnable){
// 将timer_id放入runnable对象中的链表中,并给(升起)信号灯 TSK_RUNNABLE_ENQUEUE(runnable, timer_id); return 0; } return -1; } void test_runnable() { size_t i; tsk_timer_manager_handle_t *timer_mgr = tsk_timer_manager_create(); tsk_runnable_t* runnable = tsk_runnable_create(); //创建一个runnable对象 runnable->run = run; printf("test_runnable//\n"); tsk_timer_manager_start(timer_mgr); tsk_runnable_start(runnable, tsk_obj_def_t); // 初始化runnable,启动一个线程,开始执行run函数
for(i=0; i<sizeof(runnable_timers)/sizeof(test_runnable_timer_t); ++i){ runnable_timers[i].id = tsk_timer_manager_schedule(timer_mgr, runnable_timers[i].timeout, test_runnable_timer_callback, runnable); } tsk_thread_sleep(4000); /* Stops and frees both timer manager and runnable object */ TSK_OBJECT_SAFE_FREE(runnable); // 释放runnable对象,在其析构函数中会调用tsk_runnable_stop,会等待runnable线程结束 TSK_OBJECT_SAFE_FREE(timer_mgr); }