【问题标题】:Why am I getting a thread instead of my parameters?为什么我得到一个线程而不是我的参数?
【发布时间】:2019-06-07 01:57:51
【问题描述】:

我正在使用我的 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,因此我可以从 C 调用 lua_getfield()侧,访问"visible" 字段,并对其进行处理。

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

现在,我想把对f的lua调用转换成协程,所以我从lua端做这样的事情:

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(),我传递给函数的参数,本来应该是一个表,现在是一个线程? (lua_istable() 返回 0,而lua_isthread() 返回 1)。

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

由于某种原因,我导出的一些函数会发生这种情况,但不是全部。不过,我看不出导出不同函数的方式有什么不同。

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

【问题讨论】:

  • 为什么要编写 C++/C ?这里没有C++/C这行代码,下次只写LUA
  • @SkillerDz:第一块和第三块代码是C/C++,异常行为发生在C/C++端。
  • 你是否使用选项 -DLUA_USE_APICHECK 构建了 LuaJIT?
  • @EgorSkriptunoff:我不知道那个标志。我正在使用 msvcbuild.bat,所以我将 /DLUA_USE_APICHECK 添加到 LJCOMPILE,并重新构建了游戏。我没有得到任何断言或控制台输出。我把它改成了/DLUA_USE_ASSERT,也没有

标签: lua coroutine


【解决方案1】:

我找到了答案。

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

我想每个协程都可能有自己独立的lua_State。如果你总是在lua_State 上做事,你在lua_newstate() 上做事,你可能会遇到协程问题,所以你必须确保你总是使用你在lua_CFunction 上传递的lua_State

【讨论】:

  • 这是正确的。每个协程都使用自己的堆栈创建,因此为了使 API 函数正常工作,创建一个新的lua_State,链接到主状态。正确的lua_CFunction 实现(传递给 Lua 状态的实现)应该使用在参数中传递的 Lua 指针。
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多