7

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

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

4

4 回答 4

14

也许回避这个问题,但您可以使用 Lua 协程而不是自定义 C 的东西来等到某个事件发生。

例如,一个协程可以调用 waitForEvent() 函数。在那里,您可以切换到另一个 coro,直到该事件发生,然后恢复第一个。查看lua coro 文档以了解更多信息。

于 2009-03-14T20:22:26.983 回答
6

如果您可以使用 Lua 的协作线程(显式屈服)功能编写那些等待已久的 C 例程,Jder 使用协程的建议将非常有效。您仍将使用 lua_pcall() 进入 Lua,但入口点将是您的协程管理器函数。

这只有在 C 例程在等待时不做任何事情时才有效。如果它们因为计算某些东西而长时间运行,那么您需要运行多个操作系统线程。Lua 是线程安全的——只需创建多个线程并在每个线程中运行 lua_open()。

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

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

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

于 2009-03-14T20:56:40.693 回答
5

如果您采用操作系统线程方式,请查看Lua Lanes。我会认为它是您想要实现的目标的完美解决方案(= 将一个插件模块添加到混合中,您将使用无缝内置的多线程制作清晰、易于理解和简单的代码)。

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

于 2009-03-15T23:10:24.217 回答
2

调试界面有帮助吗?

于 2009-03-14T20:19:06.650 回答