当前位置:  开发笔记 > 编程语言 > 正文

低级Lua口译员

如何解决《低级Lua口译员》经验,为你挑选了3个好方法。

有没有办法从C/C++程序运行Lua代码,比标准的"lua_pcall"函数调用更精细?理想情况下,我希望能够遍历一个低级字节码指令列表(假设它有这样的东西)并逐个运行它们,这样我就可以编写自己的调度程序,它可以控制事物而不仅仅是运行从头到尾完整的Lua功能.

我想这样做的原因是因为我希望实现Lua代码可以调用的C函数,这将导致程序在继续执行之前等待某个(可能是冗长的)动作完成.在典型的Lua脚本中会有很大比例的这样的函数调用,所以在动作完成后重写它以使用回调的想法并不实际.



1> Jesse Rusak..:

也许是侧面提出这个问题,但是你可以使用Lua协程而不是自定义C的东西来等待某个事件发生.

例如,一个协程可以调用waitForEvent()函数.在那里,您可以切换到另一个coro,直到该事件发生,然后恢复第一个.请查看lua coro docs以获取更多相关信息.



2> Ken Fox..:

如果您可以使用Lua的协作线程(显式良率)功能编写那些长时间等待的C例程,那么Jder建议使用协同程序将非常有效.你仍然会使用lua_pcall()来输入Lua,但是入口点将是你的协程管理器功能.

这只适用于C例程在等待时不执行任何操作的情况.如果他们长时间运行,因为他们计算某些东西,那么你需要运行多个OS线程.Lua是线程安全的 - 只需创建多个线程并在每个线程中运行lua_open().

来自http://www.lua.org/pil/24.1.html

Lua库根本没有定义全局变量.它将所有状态保存在动态结构lua_State中,并将指向此结构的指针作为参数传递给Lua中的所有函数.这种实现使Lua可以重入并准备好在多线程代码中使用.

您也可以将这两种方法结合起来.如果你有一个包装器Lua函数来启动一个OS线程,你可以在启动线程后产生.协程管理器将跟踪线程并在它启动的线程完成后继续协程.这允许您使用单个Lua解释器和多个运行纯C代码的工作线程.



3> akauppi..:

如果您采用OS线程方式,请查看Lua Lanes.我认为它是你想要实现的目标的完美解决方案(=将一个插件添加到混合中,你将制作清晰,易懂和简单的代码,并且无缝内置多线程).

请告诉我们您的问题是如何解决的.:)

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有