为什么我得到一个线程而不是参数?

时间:2019-01-12 09:57:41

标签: lua coroutine

我正在使用C / C ++游戏中的lua 5.3来编写其行为的某些部分。

在C ++程序中,我以以下方式调用lua函数main的每一帧:

lua_getfield(VMState, LUA_GLOBALSINDEX, "main");
int result = lua_pcall(VMState, 0, 0, 0);

我希望脚本定义一个名为main的函数,该函数可以完成很多工作。例如,我可以使用一个脚本来执行以下操作:

local f = function()
    draw_something({visible = true, x = 0, y = 0})
end

main = function()
    f()
end

draw_something()是C代码的回调,它对传递的参数做了一些有趣的事情:

lua_getfield(VMState, 1, "visible");
bool visible = (bool)lua_toboolean(VMState, 2); lua_pop(VMState, 1);
if (!visible)
    return;
// Do some other stuff

有趣的是,在调用此回调时,我作为参数传递给lua端的do_something的匿名表现在位于堆栈位置1,因此我可以调用{{1} },然后访问lua_getfield()字段并对其进行处理。

这很好用,多年来我已经做了很多类似的事情。

现在,我想将lua调用转换为"visible"到协程,因此我从lua方面执行以下操作:

f

结果应相同。但是,现在发现,通过将调用移至协程内部的local f = function() draw_something({visible = true, x = 0, y = 0}) end local g = coroutine.create(function() while true do f() coroutine.yield() end end main = function() coroutine.resume(g) end ,我传递给该函数的参数(应该是一个表)现在是线程了吗? (draw_something()返回0,而lua_istable()返回1)。

有趣的是,向回调函数传递多少个参数无关紧要:0、1、4、50,从回调内部我只得到一个参数,它是一个线程。

由于某种原因,这是我导出的某些功能(并非全部)发生的。我在导出不同功能的方式上看不出任何差异。

lua是否有理由将我的参数切换到线程?

1 个答案:

答案 0 :(得分:3)

我找到了答案。

事实证明,在lua_State上传递给您的lua_CFunction与在lua_newstate()上获得的lua_State不能保证相同

我想每个协程可能都有自己的独立lua_State。如果您总是在lua_newstate()上使用lua_State进行操作,那么协程可能会出现问题,因此必须确保始终使用{{1 }}。