Doubango runnable使用方法

来源:互联网 发布:2016淘宝代销赚钱吗 编辑:程序博客网 时间:2024/05/22 06:50

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;
// 对象定义类需要的构造函数、析构函数、比较函数等,参见Doubango的C语言实现对象式编程原理
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;}
// 对象定义类声明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); }