darwin之n秒内无流判断(timeoutTask)

来源:互联网 发布:淘宝企业店铺需要资料 编辑:程序博客网 时间:2024/06/06 19:00



timeoutTask被实例话后便被放到了静态类TimeoutTaskThread中,timeoutTask与idleTask不同,没有额外开辟线程,而是借用taskThread线程池,在Run中返回一个大于0的值,使其持续被调用..TimeoutTaskThread维护了所有的timeoutTask,周期性的被taskthread触发Run函数,在其内部不断的判断每一个timeoutTask是否超时,如果超时,则触发timeouttask关联的Task.TimeoutTaskThread实质并不是线程,而是一个周期性被调用的task,默认有一个周期性被调用的时间,但是如果内部任意一个timeoutTask时间小于默认值,则Run直接return TimeoutTask时间,下次该run函数调用时间缩短.也就是说,当Run函数被执行后,下一次何时调用的时间判断为:所有TimeoutTask的超时时间中最小的一个(如果其值比默认周期值(kIntervalSeconds )还小).





class CRecStream : public Task{private:TimeoutTask m_TimeoutTask;int         m_nTimeOutSec;public:void  PullStream(){m_TimeoutTask.RefreshTimeout();}CRecStream(int nTimeoutSec):m_TimeoutTask(this){m_nTimeOutSec = nTimeoutSec;printf("set %d秒 无流则超时\n", nTimeoutSec);m_TimeoutTask.SetTimeout(m_nTimeOutSec*1000);}virtual SInt64          Run(){GetEvents();printf("%d 秒无流,超时\n", m_nTimeOutSec);return 0;}};int main(){Init();TimeoutTask::Initialize();//15s无流则认为断开CRecStream RecStream(15);for (int i = 1; i < 100; i++){OSThread::Sleep(1000 * i); //暂停n秒printf("sleep %d秒后收到流\n", i);RecStream.PullStream();}


原创粉丝点击