如何从 Lua-lanes 调用 C 函数

我想使用 lanes 从 Lua 调用 C 函数。

int initApp(lua_State *L) {
    lua_createtable(L, 0, 0);

    lua_pushcfunction(L, get_appinfo);
    lua_setfield(L, -2, "get_appinfo");

    lua_setglobal(L, "App");

    return 0;
}
local function thread1(n)
    return App.get_appinfo(n)
end

function startlanes()
    local lanes = require 'lanes'
    package.preload['App'] = function() return App end
    package.loaded['App'] = App
    local app = require 'App'
    print(app, app.get_appinfo) --table: 0x1234    function: 0x5678
    --(1)
    f = lanes.gen('*', {required = {'App'}}, thread1) --Lua Error: module 'App' not found: no field package.preload['App']...
    --(2)
    --f = lanes.gen('App', thread1) -- Bad library name: App
    a = f(1)
    sleep(1)
end

当我运行 (1) 时,我得到了 Lua 错误: 模块“ App”未找到:无字段 package.preload ['App'] ...无文件' / App.lua '...。当我运行 (2) 时,我得到了“错误的库名称:App”。

如何使用 lanes 调用“App.get_appinfo()”?我可以将所有“App”函数移动到 package 中,但是它必须从内存而不是文件系统中加载。我嵌入了所有 Lua 包。

原文链接 https://stackoverflow.com/questions/70125903

点赞
stackoverflow用户1847592
stackoverflow用户1847592
  1. 将你的 C 函数 initApp 暴露给 Lua,比如 _G.init_App
    lua_pushcfunction(L, initApp);
    lua_setglobal(L, "init_App");
  1. 在每个 Lane 启动时将其作为参数传递
  2. 在 Lane 内部调用 init_App(作为第二个参数接收)- 它将创建你的库
local function thread1(n, init_App)
    init_App()  -- 在当前 Lane 中创建全局表 App
    return App.get_appinfo(n)
end

function startlanes()
    local lanes = require 'lanes'
    local f = lanes.gen('*', thread1)
    a = f(1, init_App)  -- 将你的模块加载器作为参数传递
    sleep(1)
end
2021-11-26 18:45:28
stackoverflow用户1150448
stackoverflow用户1150448

要调用 C 函数,必须将一个函数作为 on_state_create 传递给 lanes.configure

//c 代码
int init_App(lua_State *L) {
    lua_createtable(L, 0, 0);

    lua_pushcfunction(L, get_appinfo);
    lua_setfield(L, -2, "get_appinfo");

    lua_setglobal(L, "App");

    return 0;
}

int init(lua_State *L) {
    lua_pushcfunction(L, init_App);
    lua_setglobal(L, "init_App");
    luaL_dostring(L, "local lanes = require 'lanes'.configure{on_state_create=init_App}; local l = lanes.linda()");
    luaL_dostring(L, "startlanes()");
}

--lua 代码
local function thread1(n)
    return App.get_appinfo(n)
end

function startlanes()
    local lanes = require 'lanes'
    local f = lanes.gen('*', thread1)
    a = f(1)
    sleep(1)
    print(a[1])
end
2021-12-02 07:28:50