使用一个单向或者双向链表,或者使用一个优先队列(priority_queue).
队列中的元素为一个计时器对象。计时器对象包括,从标准时间(程序运行时)开始的时间差。越晚触发的计时器,这个值越大,及触发器事件类型。
如果只使用链表,每次插入后,就要进行一次重排,如果使用优先队列,自动插入顺序位置,我想使用优先队列应该效果好些,还要实验。
每次心跳(服务器线程循环),调用时间服务OnTicker函数,此函数检查队列中最前一个计时器的时间值,如果到达或者超过当前时间的时间差,就将此计时器取出,然后调用其触发器事件。
现在,有二个问题还未解答:
1.时间差值的精确程度,精确到什么程度?最好的情况是精确到微秒,那样,时间服务中的队列可能就会到几十万,这样对插入会有多大的影响,需要具体测试。
2.关于时间差的问题,以什么方式设置?目前使用的TICK是DWORD,32位,42亿多毫秒,换成天数是是49.71天,如果时间差直接放系统TICK+触发事件需要的时间,那么很可能会溢出。如果以程序运行时间为0点,且此时间点的系统TICK为SYSTEM_TICK,以此为参照,新加入的事件的时间值EVENT_TICK为:
EVENT_TICK = NOW_TICK(当前系统TICK) - SYSTEM_TICK+NEED_TIME(需要的时间),也就是说存放时有一个换算过程。这样最多可以存放离程序运行49天内的触发器。还没有考虑好