零、前言Lua语言不支持真正的多线程,即不支持共享内存的抢占式线程。这样的模式能减少一些多线程的问题。多线程的问题源于线程抢占和共享内存,而如果非抢占式线程或者不使用共享内存则能避免多线程问题,Lua同时支持这两种方案。从之前分享的《Lua协程》文章中知道:Lua语言的线程是协作式的,即协程,可以避免因不可预知的线程切换带来的问题。Lua状态间内存不共享,所以各个状态相互独立运行,可以并行操作。一、多线程从C-API的角度,可以把线程当作一个栈,每个栈保存着一个线程中挂起的函数调用信息,以及每个函数调用的参数和局部变量。也就是说,一个栈包括了一个线程得以继续运行所需的所有信息。因此,要达到多线
我在C++应用程序中嵌入了一个Lua解释器。我想为运行脚本设置一个“环境”,以便所有脚本都可以使用某些变量。例如,我想将只读对象Foo和FooBar公开给脚本,这样Foo和FooBar可用于所有正在运行的脚本。有谁知道我该怎么做?展示如何做到这一点的片段将非常有用。 最佳答案 我没有听说过Lua中的只读变量,但您可以通过函数调用使环境可用来防止修改。如果C++应用程序很大,您可能希望使用工具来生成可以从Lua调用的接口(interface)。我过去曾幸运地使用过tolua++:假设demo.hpp是C++应用程序的头文件:#ifnd
我目前正在使用LuaPlus开发一个项目,我需要能够使用GUID,但似乎无法在lua中找到它们。当我为lua构建数据时,没有setGUID,有设置数字、设置字符串等。还有一个Set()函数。有谁知道将GUID从c++传递到lua以及从lua传递到c++的正确方法。非常感谢。更新:谢谢大家的回复。感谢您的快速回复。我实际上不会经常搜索类型转换,主要是在我们加载所有内容时在前端搜索。但是,我可能有点担心太多,因为游戏有点小而且不会有大量Actor无论如何。我正在考虑在lua中编写一个优化的字符串比较,您可以在其中针对测试参与者检查GUID的第一个字符。如果通过,则转到第二个,依此类推。如果
例如,假设我有一个键处理接口(interface),在C++中定义为:classKeyBoardHandler{public:virtualonKeyPressed(constKeyEventArgs&e);virtualonKeyReleased(constKeyEventArgs&e);}现在,我想将它扩展到Lua,让Lua可以利用并在脚本中注册一个KeyboardHandler。这是到目前为止的原型(prototype)。classScriptKeyboardHandler:publicKeyboardHandler{public:...previousmethodsomitte
这可能是一个简单的问题,但我被难住了。这是针对Lua5.1的。我有一个在自己的环境中运行的脚本。在那个环境中,我有一个名为“plugin”的变量,我从C++中设置如下:lua_getfield(L,LUA_REGISTRYINDEX,getScriptId());//Putscript'senvtableontothestack--env_tablelua_pushstring(L,"plugin");//--env_table,"plugin"luaW_push(L,this);//--env_table,"plugin",*thislua_rawset(L,-3);//env_ta
如何将C++对象返回给lua?我的C++代码如下:classMyClass{public:voidsay(){print("Hello\r\n");}};inttest(lua_State*l){MyClass*obj=newMyClass();lua_pushlightuserdata(l,obj);return1;}Lua测试如下:locala=MyClass:new()a:say()如何修改test()函数使其正常工作?obj会被lua自动销毁吗?PS:我已经设置了MyClass元表如下voidl_registerClass(){lua_newtable(l);intmethod
在C++中,假设我有一个创建二叉树结构的类,我使用它是这样的:CTreeRoot*root=newCTreeRoot(/*whatever*/);CNode*leftNode=root->getLeftNode();CNode*rightNode=root->getRightNOde();leftNode->doSomething();rightNode->doSomething();//etc并假设左右节点有自己的左右节点(因此,二叉树)。现在我想将它公开给Lua(不使用luabind)这样我就可以做同样的事情:localroot=treeroot.new(/*whatever*/)
我正在尝试从Lua表中获取值。这是我在Program.cpp中写的:lua_State*lua=luaL_newstate();luaL_openlibs(lua);luaL_dofile(program->getLuaState(),"Script.lua");lua_getglobal(lua,"table");lua_pushstring(lua,"x");lua_gettable(lua,-2);printf("%i",lua_tonumber(lua,-1));我在Script.lua中写了这个:table={x=12,y=32}问题是这只会在控制台中写入0。我检查过lua文
我了解Luabind,我可以公开类,然后可以在lua中创建这些类的实例。module[L_state][class_("Player").def(constructor()).def("Update",&Player::Update)];test.luaplayer=Player()player:Update()但是如果我想在C++中创建播放器实例怎么办,因为我想在C++中调用它的成员,但我也想将播放器的相同实例公开给Lua,以便它仍然可以调用它的函数,例如:player:Update() 最佳答案 您可以通过luabind将值压入
我已经为这个简单的事情尝试了很多替代方案,但无法让它发挥作用。我希望用户在第一步中从Lua定义一个表:a={["something"]=10}--key=something,value=10然后,在第二步中,用户将从Lua中调用一个用C++设计的函数:b=afunction(a)--afunctionwillbedesignedinC++C++代码:intlua_afunction(lua_State*L){intnargs=lua_gettop(L);if(nargs>1)throw"ERROR:Only1argumentintheformoftablemustbesupplied.