首页 > 解决方案 > 为什么我得到一个线程而不是我的参数?

问题描述

我正在使用我的 C/C++ 游戏中的 lua 5.3 来允许对其行为的某些部分进行脚本化。

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

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,因此我可以lua_getfield()从 C 端调用以访问该"visible"字段,然后执行有什么东西。

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

现在,我想将 lua 调用转换f为协程,所以我从 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 是否有任何理由将我的参数切换到线程?

标签: luacoroutine

解决方案


我找到了答案。

事实证明,lua_State在 a 上传递给你的那个lua_CFunction不能保证和你第一次得到的一样lua_newstate()

我想每个协程都可能有自己独立的lua_State. 如果你总是lua_State在.lua_newstate()lua_Statelua_CFunction


推荐阅读