Created
August 26, 2013 06:35
-
-
Save hanxi/6338589 to your computer and use it in GitHub Desktop.
单消息多处理函数的实现.注册消息处理函数时可提供优先执行函数列表(即在优先执行函数列表中的函数先于正在注册的函数).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--[[============================================================================= | |
# FileName: HXProtHandler.lua | |
# Desc: 单个消息多个处理函数带有优先级的实现 | |
# Author: hanxi | |
# Email: hanxi.com@gmail.com | |
# HomePage: http://hanxi.cnblogs.com | |
# Version: 0.0.1 | |
# LastChange: 2013-08-26 11:42:37 | |
# History: 添加优先级冲突检测 | |
=============================================================================]] | |
-- 全局变量 | |
-- _GProtFuncName2Func = { -- 绑定函数名和函数 | |
-- funcName1 = func1, | |
-- funcName2 = func2, | |
-- } | |
-- _GProtHandlers = { -- 绑定协议号和函数名 | |
-- [protId] = { -- key为函数名,preFuncNames为优先执行函数名组 | |
-- funcName1 = preFuncNames, | |
-- funcName2 = preFuncNames, | |
-- } | |
-- } | |
-- preFuncNames = { -- 收到消息时,优先执行下面的函数 | |
-- preFuncName1,preFuncName2, | |
-- } | |
-- 按优先级排序后的handler函数 | |
-- _GProtHandlersForExec = { | |
-- [protId] = {func1,func2} | |
-- } | |
function log (...) | |
print(...) | |
end | |
-- @param:protId -- 协议Id | |
-- @param:func -- 注册函数 | |
-- @param:funcName -- 注册函数名 | |
-- @param:preFuncNames -- 优先执行函数名组 | |
function HXProtRegHandler(protId,func,funcName,preFuncNames) | |
if not protId or type(func)~="function" or type(funcName)~="string" then | |
error("HXProtRegHandler 参数错误") | |
return -1 | |
end | |
if not preFuncNames then | |
preFuncNames = {} | |
end | |
if not _GProtHandlers then | |
_GProtHandlers={} | |
end | |
if not _GProtHandlers[protId] then | |
_GProtHandlers[protId]={} | |
end | |
_GProtHandlers[protId][funcName] = preFuncNames | |
if not _GProtFuncName2Func then | |
_GProtFuncName2Func = {} | |
end | |
_GProtFuncName2Func[funcName] = func | |
if type(_GProtHandlersForExec)=="table" then | |
-- 用于热更新的时候,重置_GProtHandlersForExec | |
_GProtHandlersForExec[protId] = nil | |
end | |
end | |
-- 查找表中是否存在value | |
function table.find(tab, value) | |
for k,v in pairs(tab) do | |
if v==value then | |
return k | |
end | |
end | |
return -1 | |
end | |
-- 查找表中所有存在的value | |
function table.findall(tab, value) | |
local result = {} | |
for k,v in pairs(tab) do | |
if v==value then | |
table.insert(result,k) | |
end | |
end | |
if #result==0 then | |
return -1 | |
end | |
return result | |
end | |
-- 收到协议id为protId的消息时进入此函数处理 | |
HXProtExecHandler = function (fd,protId,prot) | |
local handlers = _GProtHandlers[protId] | |
if not handlers then | |
log("ERROR: 收到为注册的协议.protId=",protId) | |
for k,v in pairs(prot) do | |
log(k,v) | |
end | |
return | |
end | |
if not _GProtHandlersForExec then | |
_GProtHandlersForExec = {} | |
end | |
if not _GProtHandlersForExec[protId] then | |
_GProtHandlersForExec[protId] = {} | |
for funcName,preFuncNames in pairs(handlers) do | |
log("["..funcName.."]") | |
for k,v in pairs(preFuncNames) do | |
log("--",v) | |
end | |
local pos = table.find(_GProtHandlersForExec[protId],funcName) | |
log("pos",pos,funcName) | |
if pos==-1 then | |
table.insert(_GProtHandlersForExec[protId],funcName) | |
pos = #_GProtHandlersForExec[protId] | |
end | |
for _,preFuncName in ipairs(preFuncNames) do | |
local p = table.find(_GProtHandlersForExec[protId],preFuncName) | |
log("p",p,preFuncName) | |
if p==-1 then | |
table.insert(_GProtHandlersForExec[protId],pos,preFuncName) | |
elseif p>pos then | |
log("优先函数处理有冲突:"..funcName..","..preFuncName) | |
end | |
end | |
end | |
end | |
for k,funcName in ipairs(_GProtHandlersForExec[protId]) do | |
local func = _GProtFuncName2Func[funcName] | |
if not func then | |
log("协议protId="..protId..",有未实现的handler函数,funcName="..funcName) | |
else | |
func(fd,prot) | |
end | |
end | |
end | |
-- test | |
function f1(fd,prot) | |
log("f1",prot) | |
end | |
-- 注册处理函数 | |
HXProtRegHandler(1,f1,"f1",{"f2","f3"}) | |
function f2(fd,prot) | |
log("f2",prot) | |
end | |
HXProtRegHandler(1,f2,"f2",{"f1"}) | |
function f3(fd,prot) | |
log("f3",prot) | |
end | |
HXProtRegHandler(1,f3,"f3",{"f1","f4"}) | |
function f4(fd,prot) | |
log("f4",prot) | |
end | |
HXProtRegHandler(1,f4,"f4",{"f2","f3"}) | |
function f5(fd,prot) | |
log("f5",prot) | |
end | |
HXProtRegHandler(1,f5,"f5",{"f7"}) | |
-- 假设收到消息1 | |
HXProtExecHandler(1,1,"prot") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment