Doubango 定时器管理用法

Doubango timer笔记 

下面是Doubango定时器管理器的测试用例,说明了其用法。定时器管理器实现了: 通过创建两个线程,实现多个定时器管理,当定时时间到了后,调用定时器的回调函数。

基本实现原理大致是这样。按定时时间,将定时器排序,取出最小的那个定时器(最近即将发生的那个),比较当前时间,若还差时间,进行等待(Windows下调用WaitForSingleObjec实现,Linux下调用pthread_cond_timedwait)。

#ifndef _TEST_TIMER_H_
#define _TEST_TIMER_H_
typedef struct test_timer_s
{
	tsk_timer_id_t id;
	uint64_t timeout;
	const char *arg;
}
test_timer_t;

test_timer_t 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"},
};

static int test_timer_callback(const void* arg, tsk_timer_id_t timer_id)
{
	// Do quick job
	printf("test_timer - id=%llu and arg=%s//\n", timer_id, arg);
	return 0;
}

void test_global_timer()
{
	size_t i;
	tsk_timer_mgr_global_ref();

	// for test: start it two times
	tsk_timer_mgr_global_start();
	tsk_timer_mgr_global_start();

	for(i=0; i<sizeof(timers)/sizeof(test_timer_t); ++i){
		timers[i].id = tsk_timer_mgr_global_schedule(timers[i].timeout, test_timer_callback, timers[i].arg);
	}

	tsk_timer_mgr_global_cancel(timers[6].id);
	tsk_timer_mgr_global_cancel(timers[2].id);

	tsk_thread_sleep(4000);

	// for test: stop it only one time
	tsk_timer_mgr_global_stop();
	tsk_timer_mgr_global_stop();

	tsk_timer_mgr_global_unref();
}

void test_single_timer()
{
	size_t i;
	// 创建定时器管理器对象
	tsk_timer_manager_handle_t *handle = tsk_timer_manager_create();
	printf("test_timer//\n");
	
	// 启动定时器管理器,由于管理器又是个runnable对象,这里启动一个线程(runnable线程)执行run函数;
	// 在run函数中,再创建一个主线程(定时器管理器线程主线程)。
	// 定时器管理器线程主线程依次逐个从链表中取出定时器(按超时时间排序的),检查是否定时时间到了。
	// 如果定时时间到了,就将定时器放入runnable中链表中,由runnable线程进行处理,调用定时器回调函数;
	// 如果定时时间没有到,则超时等待信号tsk_condwait_timedwait(超时时间=定时时间-当前时间)
	tsk_timer_manager_start(handle);
	
	for(i=0; i<sizeof(timers)/sizeof(test_timer_t); ++i){
		// 创建定时器,并将定时器对象放入管理器的链表中,并发出信号tsk_condwait_signal
		timers[i].id = tsk_timer_manager_schedule(handle, timers[i].timeout, test_timer_callback, timers[i].arg);
	}
	
	tsk_timer_manager_cancel(handle, timers[6].id);
	tsk_timer_manager_cancel(handle, timers[2].id);

	tsk_thread_sleep(4000);

	/* Stops and frees the timer manager */
	TSK_OBJECT_SAFE_FREE(handle);
}

void test_timer()
{
	test_single_timer();
	//test_global_timer();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值