2009-03-14 30 views
7

¿Hay una manera de ejecutar código Lua de un programa de C/C++ en un nivel más fino que un "lua_pcall" llamada de función estándar? Idealmente, me gustaría poder recorrer una lista de instrucciones de bytecode de bajo nivel (suponiendo que tenga tales cosas) y ejecutarlas una a una, para poder escribir mi propio programador que tenga más control de las cosas que simplemente ejecutarlo una función completa de Lua de principio a fin.de bajo nivel Lua intérprete

La razón por la que deseo hacer esto es porque deseo implementar las funciones C que el código Lua puede invocar, lo que provocaría que el programa esperara hasta que se completara una determinada acción (potencialmente larga) antes de continuar la ejecución. Habría una gran proporción de estas llamadas a función en un script de Lua típico, por lo que la idea de volver a escribirla para utilizar devoluciones de llamada una vez que la acción se haya completado no es realmente práctica.

Respuesta

14

Tal vez esquivando la pregunta, pero se puede usar en lugar de co-rutinas Lua cosas C personalizado que esperar hasta que se produzca algún acontecimiento.

Por ejemplo, una coroutine podría llamar a la función waitForEvent(). Allí, puedes cambiar a otro coro hasta que ocurra ese evento, luego reanudar el primero. Eche un vistazo a the lua coro docs para obtener más información al respecto.

+1

Esta solución parece tener un gran potencial, sobre todo teniendo en cuenta que la API C puede producir/reanudar coroutines. – andygeers

6

la sugerencia de utilizar jder corrutinas va a funcionar muy bien si se puede escribir los tiempos de espera rutinas C usando la función de roscado cooperativo (rendimiento explícito) de Lua. Seguirás usando lua_pcall() para ingresar a Lua, pero el punto de entrada será tu función de administrador de corrutinas.

Esto solo funciona si las rutinas C no hacen nada mientras esperan. Si son de larga ejecución porque calculan algo, por ejemplo, entonces necesita ejecutar varios hilos del sistema operativo. Lua es seguro para los hilos: simplemente cree varios hilos y ejecute lua_open() en cada hilo.

De http://www.lua.org/pil/24.1.html

La biblioteca Lua no define variables globales en absoluto. Se conserva toda su estado en la estructura dinámica lua_State y un puntero a esta estructura se pasa como argumento a todas las funciones dentro de Lua. Esta implementación de hace que Lua reentrant y estén listos para su uso en el código multiproceso .

También puede combinar los dos enfoques. Si tiene una función envoltura Lua para iniciar un hilo del sistema operativo, puede ceder después de iniciar el hilo. El administrador de Coroutine hará un seguimiento de los hilos y continuará una corrutina cuando el hilo que comenzó haya finalizado. Esto le permite usar un solo intérprete de Lua con múltiples hilos de trabajo que ejecutan código C puro.

5

Si usted va la manera OS roscado, por favor, echar un vistazo a Lua Lanes. Yo vería que es la solución perfecta para lo que estás tratando de lograr (= lanzar un módulo adicional a la mezcla y estarás haciendo un código claro, comprensible y simple con multiproceso integrado sin problemas).

Cuéntenos cómo se resolvió su problema. :)

+0

Gracias por el enlace. Definitivamente echaré un vistazo a este – andygeers

Cuestiones relacionadas