Doubango runnable使用方法

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); 
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值