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



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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值