Невозможно вызвать функцию 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()

Это должно работать нормально.

Другие вопросы по тегам