Corutinas en LUA.

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Hola buenas, quería saber si alguien me puede echar una mano con un ejemplo acerca de como se usan las corutinas ya que por más que miro la ayuda del LUA con el ejemplo que me ponen no soy capaz de hacerlo.

El ejemplo que me ponen es:
co = coroutine.create(function (a,b)
           print("co-body", a, b)
           local r = foo(a+1)
           print("co-body", r)
           local r, s = coroutine.yield(a+b, a-b)
           print("co-body", r, s)
           return b, "end"
end)
Yo con esto no entiendo si la función la tengo que crear así en globals, o tengo que crear la función y después llamarla con cotoutine.create, vamos no me entero.

He probado a hacerlo de las dos formas y poniéndolo en globals siempre me pide que ponga un paréntesis al final de línea para cerrar la coroutina, y si lo hago llamando la función con la coroutina me devuelve un error diciendo que tengo que poner una función, y lo mejor de todo es que la función la ejecuta correctamente y el error lo devuelve al terminar...

Gracias anticipadas y haber si me podéis echar una manita ;)
En el código que pones sólo estas creando la corutina, pero nunca la estas ejecutando. Además no veo que declares la función foo(a,b) por ninguna parte.

Después de crear una corutina debes ejecutarla con sus parámetros (usando tu ejemplo):
local a, b = coroutine.resume(co, 1, 2);
Dialog.Message("", tostring(a).."-"..tostring(b));
Por cierto, yo hice un par de ejemplos de corutinas (incluso creando un server tcp). Chécalos y revisa bien el código.
Creo que ya lo he pillado... despues haré pruebas a ver...

Gracias compi por contestar ;)
Que verde estoy XD , esto de las corutinas que funcionalidad tiene?
Bueno es como los "Hilos" en LUA, ya que el LUA es principalmente lineal y lo que hace es ejecutar una cosa detrás de otra, entonces con las corutinas creas un proceso independiente que se ejecuta paralelamente con el código principal.
En mi caso es para crear un programa multithreading, como los programas que uso para convertir el audio utilizan un solo hilo pues entonces que mejor que ejecutar tantos programas como hilos tengas, no desaprovechas el procesador y multiplicas la velocidad de procesamiento.
También podría hacerlo detectando el proceso y ejecutando otro si hay menos procesos de los estipulados, pero es un poco más sucio que esto y si ejecutas otro proceso igual fuera del programa te lo estaría detectando también...
lua no es multithreading....y con las corutinas no lo puedes hacer...Lo que lograrías si acaso sería una aplicación multitask...
webultra escribió:lua no es multithreading....y con las corutinas no lo puedes hacer...Lo que lograrías si acaso sería una aplicación multitask...
hablando de multi... mirate esto:

Código: Seleccionar todo

http://www.mindquake.com.br/en/actions/multithread