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