pjlib是一个用C实现的非常好的开源基础库,日前研究了一下pjlib的一些组件。
pjlib的timer heap似乎不支持循环定时器(目前我还未看到),修改源码应该可以实现,但现在我先从应用的角度,研究了一下使用timer heap的接口实现一个循环定时器。
代码如下,实现细节可参考注释。
-
/*****************************************************************************
-
函 数 名 : printTimeStamp
-
功能描述 : 打印时间戳
-
输入参数 :
-
输出参数 :
-
返 回 值 : static void
-
*****************************************************************************/
-
static void printTimeStamp(void)
-
{
-
pj_time_val tv;
-
pj_parsed_time pt;
-
-
pj_gettimeofday(&tv);
-
pj_time_decode(&tv, &pt);
-
PJ_LOG(3,("xxx",
-
"...%04d-%02d-%02d %02d:%02d:%02d.%03d",
-
pt.year, pt.mon, pt.day,
-
pt.hour, pt.min, pt.sec, pt.msec));
-
-
return;
-
}
-
-
/*****************************************************************************
-
函 数 名 : test_timer_pthread
-
功能描述 : 定时器线程回调函数
-
输入参数 :
-
输出参数 :
-
返 回 值 : static void *
-
*****************************************************************************/
-
static void *test_timer_pthread(void *parg)
-
{
-
int i = 0;
-
pj_status_t rc;
-
-
delay.sec = 1;
-
delay.msec = 0;
-
-
printf("enter thread test_timer_pthread.........\n");
-
-
/* 增加一个timer entry */
-
pj_timer_heap_schedule(timer, &entry[1], &delay);
-
while (1)
-
{
-
/* 询问定时器是否到期,到期则执行回调
-
* 定时器到期rc返回值为1,表示有一个定时器到期 */
-
rc = pj_timer_heap_poll(timer, NULL);
-
if (1 != rc)
-
continue;
-
/* 这里再次poll,为了让定时器到期数减为0,即rc值变为0 */
-
rc = pj_timer_heap_poll(timer, NULL);
-
/* 再次加入相同的timer entry,实现循环定时器 */
-
pj_timer_heap_schedule(timer, &entry[1], &delay);
-
}
-
-
return NULL;
-
}
-
-
/*****************************************************************************
-
函 数 名 : test_create_timer_pthread
-
功能描述 : 创建定时器线程
-
输入参数 :
-
输出参数 :
-
返 回 值 : static void
-
*****************************************************************************/
-
static void test_create_timer_pthread(void)
-
{
-
int lRet = -1;
-
int lUsamPthreadId = -1;
-
-
lRet = pthread_create( &lUsamPthreadId, NULL, test_timer_pthread, NULL );
-
if (0 != lRet)
-
{
-
printf("pthread_create lUsamPthreadId error: %d\n", lRet);
-
return;
-
}
-
/* 设置子线程为分离态 */
-
pthread_detach(lUsamPthreadId);
-
-
return;
-
}
-
-
/*****************************************************************************
-
函 数 名 : timer_callback
-
功能描述 : 定时器回调函数
-
输入参数 :
-
输出参数 :
-
返 回 值 : static void
-
*****************************************************************************/
-
static void timer_callback(pj_timer_heap_t *ht, pj_timer_entry *e)
-
{
-
if (NULL == e)
-
{
-
printf("NULL e ptr!!!!\n");
-
-
return;
-
}
-
-
printf("user_data = %d\n", *(int *)(e->user_data));
-
printTimeStamp();
-
}
-
static int testUserDataA[MAX_COUNT] = {0};
-
-
/*****************************************************************************
-
函 数 名 : test_timer_heap_k
-
功能描述 : 测试定时器堆
-
输入参数 : void
-
输出参数 : 无
-
返 回 值 : static int
-
*****************************************************************************/
-
static int test_timer_heap_k(void)
-
{
-
int i, j;
-
pj_pool_t *pool;
-
pj_time_val timout_kk;
-
pj_status_t rc; int err=0;
-
unsigned size, count;
-
pj_time_val now, expire;
-
-
size = pj_timer_heap_mem_size(MAX_COUNT)+MAX_COUNT*sizeof(pj_timer_entry);
-
pool = pj_pool_create( mem, NULL, size, 4000, NULL);
-
if (!pool) {
-
PJ_LOG(3,("test", "...error: unable to create pool of %u bytes",
-
size));
-
return -10;
-
}
-
-
/* 为timer entry分配空间 */
-
entry = (pj_timer_entry*)pj_pool_calloc(pool, MAX_COUNT, sizeof(*entry));
-
if (!entry)
-
return -20;
-
-
for (i=0; i<MAX_COUNT; ++i) {
-
testUserDataA[i] = i;
-
/* 注册timer entry的回调函数 */
-
pj_timer_entry_init(entry + i, i, &testUserDataA[i], timer_callback);
-
}
-
-
/* 创建定时器堆,设置定时器堆pool大小 */
-
rc = pj_timer_heap_create(pool, MAX_COUNT, &timer);
-
if (rc != PJ_SUCCESS) {
-
app_perror("...error: unable to create timer heap", rc);
-
return -30;
-
}
-
-
/* 创建定时器线程,用于poll */
-
test_create_timer_pthread();
-
-
return err;
-
}
阅读(2298) | 评论(0) | 转发(0) |