今天由于游戏的某些整点报时的需要,比如游戏排行榜数据得在凌晨更新一次,系统发给新手的每日新手倒计时奖励得每日凌晨更新一次,还有某些每到整点就需要触发的事情。鉴于考虑这个整点报时的可复用性,就计划写一个统一的接口,让erlang中的每一个进程在调用了这个接口注册之后,都能按时收到一个 info 消息,有了这样的一个高大全,定时就简单得多了。
%% @spec start_timely_info(integer(), integer()) -> {ok, TRef} | {error, Reason}
%% @doc 调用此接口,需要在info 中添加 消息接收
%% do_info({'do_timely_info', CallBack, Kind, Num}, State) ->
%% lib_timely_info:start_timely_info(CallBack, Kind, Num, 1),
%% {noreply, State};
%% 其中CallBack是改计时器需要定时触发的回调函数
%% 定时类型(按天(2)、小时(1)、星期(3))
%% -define(TIMELY_KIND_HOUR, 1).
%% -define(TIMELY_KIND_DAY, 2).
%% -define(TIMELY_KIND_WEEK, 3).
%% % ---------------------------------------------------------
%% % 定时器抛出的事件是否激活(0表示不激活,1表示激活)
%% -define(TIMELY_HANDLE_ACTIVE, 1).
%% -define(TIMELY_HANDLE_NOT_ACTIVE, 0).
%% ---------------CallBack---Kind---Num-- Active-----------
%% ---------------回调函数--定时类型-数量-是否激活回调函数----
start_timely_info(CallBack, Kind, Num,Active) ->
if Active =:= 1 ->
{M,F,A} = CallBack,
erlang:apply(M,F,A);
true ->
skip
end,
Now = misc_timer:now_seconds(),
LeftTime =
case Kind of
?HOUR ->
?ONE_HOUR - misc_timer:now_seconds() rem ?ONE_HOUR + (Num -1) * ?ONE_HOUR;
?DAY ->
util:get_next_day_seconds(Now) - Now + (Num - 1) * ?ONE_DAY;
_ ->
?ONE_WEEK
end,
timer:send_after(LeftTime * 1000, self(),{'do_timely_info', CallBack, Kind, Num}).
在调用接口的同时,若传入回调函数,让改接口函数定时给执行的话,只需要将回调函数 Callback 当做参数传入就可以了
另:为满足某些特殊需求,比如我在注册的时候就需要启动一次这个回调函数,因此增加一个参数来确定是不是需要立即执行回调函数