分享

Linux下的定时器的实现

 lifei_szdz 2013-05-21
写一个Linux下的播放器,需要一个高精度的定时器,精确到ms。
注意我这里实现的是定时器,而不是简单的延时,所以我是不是应该单独的创建一个线程来实现。
看了SDL的部分代码,他的思路是这样的
有一个timer的线程,然后这个线程里面有一个while循环来做到的
static int RunTimer(void *unused)
{
while ( timer_alive ) {
if ( SDL_timer_running ) {
SDL_ThreadedTimerCheck();
}
SDL_Delay(1);
}
return(0);
}
SDL_ThreadedTimerCheck就是一个for循环,来历遍所有的注册过的定时器,注册信息包含一个定时器的相应函数,这样当前的间满足条件的时候就去调用对应的函数。这样实现有一个问题,当我们的SDL_timer_running移植满足的时候,这个while循环就是不停地调用SDL_ThreadedTimerCheck,而如果我们的定时器设置的比较远的一个时间,那么前面一段时间的while循环就是浪费CPU。因为我的媒体播放同时只会用到一个定时器,所以思路改进一下,这样:


delaytime time_len;
func callback;
static int RunTimer(void *unused)
{
while ( 1 ) {
Condition.wait(Mutex); //首先是挂起,等待设置定时器的条件
                select//nanosleep()//线程挂起指定的时间
                callback  //定时器的回调
                
}
return(0);
}

然后在调用的时候,每次都会先改变time_len和callback,然后一个Condition.signal,通知开始定时

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多