Невозможно вызвать функцию C из Lua-lanes
При попытке вызвать функцию C из модуля Lua, используя Lua-lanes, управление не переходит к функции 'C'. Есть ли проблема, с которой Lua-полосы не будут работать в потоке с внешней Cll?
Ниже приведен фрагмент кода
Луа Сниппет:
lanes.gen("*",func)
thread = func()
thread:join()
function func()
foo() -- expected to print "Hello world", by
-- calling below C function,but not happening
end
Фрагмент C, скомпилированный в dll с VS-2012:
static int foo(lua_state *L)
{
printf("Hello world\n")
}
2 ответа
Решение
Если вы хотите, чтобы эта функция C была доступна в новом потоке, вы должны каким-то образом перенести ее из основного потока lua в новый поток при создании полосы. Вы можете сделать это с помощью .required
из документов Луа-лейн.
Например, скажем, у вас есть этот простой foomodule:
// foomodule.c
// compiles to foomodule.dll
#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
static int foo(lua_State *L)
{
printf("Hello world\n");
return 0;
}
int luaopen_foomodule(lua_State *L)
{
lua_pushcfunction(L, foo);
lua_pushvalue(L, -1);
lua_setglobal(L, "foo");
return 1;
}
И из вашего сценария Луа:
// footest.lua
lanes = require 'lanes'.configure()
function func()
print("calling foo", foo)
return foo()
end
thr = lanes.gen("*", {required = {'foomodule', }}, func)
thr():join()
Один из возможных выходов:
calling foo function: 0x003dff98
Hello world
Вы неправильно используете дорожки. Это то, что вам нужно сделать:
function func()
foo() -- expected to print "Hello world", by
-- calling below C function,but not happening
end
local launcher = lanes.gen("*", func)
thread = launcher()
thread:join()
Это должно работать нормально.