【tolua】c++类的一个成员回调函数如何在lua中也是相当于一个回调函数?

时间:2021-01-05 17:03:35
直接贴代码求教

CServer类中

m_pAcceptor->async_accept( *pSocket, boost::bind(&CServer::acceptHandler, this,
                             pSocket, iIndex, boost::asio::placeholders::error) );


void  CServer::acceptHandler(tcp::socket *pSocket, int iIndex, error_code ec);

在纯c++运行的时候,acceptHandler函数是能够正常回调到的,但是转到lua中。

local server = CServer:new(bind_port);
function server:acceptHandler(socket, index, err)
print("--->> on_connect, index:", index);
end 
server:start()
server:run();

acceptHandler函数也是能够正常回调到的,但是确是在c++中回调,我想在lua中处理。也就是在 

function server:acceptHandler(socket, index, err)
print("--->> on_connect, index:", index);
end 

中处理,请问如何将这个回调转移到lua中触发?谢谢。

4 个解决方案

#1


CServer:new是你在C++里定义的类的静态方法,生成一个C++对象。这个c++ 对象在监听端口,同时
accepthandler 也应该在这个对象上。你监听的时候一定绑定了回调函数。如果一定要在lua 里处理,就在那个
回调函数里调用lua_callfunction,把命令转由lua脚本执行。

#2


引用 1 楼 yingruxue 的回复:
CServer:new是你在C++里定义的类的静态方法,生成一个C++对象。这个c++ 对象在监听端口,同时
accepthandler 也应该在这个对象上。你监听的时候一定绑定了回调函数。如果一定要在lua 里处理,就在那个
回调函数里调用lua_callfunction,把命令转由lua脚本执行。


您好,感谢您的回复。我的lua知识比较有限。如果我在 CServer::acceptHandler 中调用 lua 函数 
function server:acceptHandler(socket, index, err),但是我是用 tolua 将类转给lua使用的。调用lua函数应该要用到 lua_getglobal(L, "acceptHandler");  /* function to be called */ (不知道对不对),我不知道如何获取这个L值?我这个类中是没有L这个值的额,谢谢指点。

#3


我贴上我的main函数代码:


int luaopen_Engine(lua_State* tolua_S);//这个就是用tolua将c++封装后的可给lua调用的接口。

int main(int argc, char* argv[])
{
    cout << " ====== main in c++ ====== " << endl;

lua_State* L = lua_open();
luaopen_base(L);
luaopen_Engine(L);

string strLuaFile;
if (argc == 2)
{
strLuaFile = argv[1];
}
else
{
strLuaFile = "start.lua";
}

if ( luaL_loadfile(L, strLuaFile.c_str()) || lua_pcall(L, 0, 0, 0) )
{
{
            const char * error = lua_tostring(L, -1) ;
            cout << string(error) << endl;
        }
    }

cout << "in c++ exit!" << endl;
        return 0;
}

#4


问题今天解决了,做一个全局的变量就行了。

#1


CServer:new是你在C++里定义的类的静态方法,生成一个C++对象。这个c++ 对象在监听端口,同时
accepthandler 也应该在这个对象上。你监听的时候一定绑定了回调函数。如果一定要在lua 里处理,就在那个
回调函数里调用lua_callfunction,把命令转由lua脚本执行。

#2


引用 1 楼 yingruxue 的回复:
CServer:new是你在C++里定义的类的静态方法,生成一个C++对象。这个c++ 对象在监听端口,同时
accepthandler 也应该在这个对象上。你监听的时候一定绑定了回调函数。如果一定要在lua 里处理,就在那个
回调函数里调用lua_callfunction,把命令转由lua脚本执行。


您好,感谢您的回复。我的lua知识比较有限。如果我在 CServer::acceptHandler 中调用 lua 函数 
function server:acceptHandler(socket, index, err),但是我是用 tolua 将类转给lua使用的。调用lua函数应该要用到 lua_getglobal(L, "acceptHandler");  /* function to be called */ (不知道对不对),我不知道如何获取这个L值?我这个类中是没有L这个值的额,谢谢指点。

#3


我贴上我的main函数代码:


int luaopen_Engine(lua_State* tolua_S);//这个就是用tolua将c++封装后的可给lua调用的接口。

int main(int argc, char* argv[])
{
    cout << " ====== main in c++ ====== " << endl;

lua_State* L = lua_open();
luaopen_base(L);
luaopen_Engine(L);

string strLuaFile;
if (argc == 2)
{
strLuaFile = argv[1];
}
else
{
strLuaFile = "start.lua";
}

if ( luaL_loadfile(L, strLuaFile.c_str()) || lua_pcall(L, 0, 0, 0) )
{
{
            const char * error = lua_tostring(L, -1) ;
            cout << string(error) << endl;
        }
    }

cout << "in c++ exit!" << endl;
        return 0;
}

#4


问题今天解决了,做一个全局的变量就行了。