Anuncios Google

Para que sirven las corrutinas en LUa

Pues mi duda es si alguien me puede explicar que es una corrutina en lua y cual es su finalidad y si podria ser, ponerme algun ejemplo, por que no consigo entenderlas, me he quedado atascado con eso xD. Gracias de atemano.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de sting18

aqui tienes todo lo que

Imagen de clizana

Un consejo

Si no sabes explicar lo que preguntan o no quieres hacerlo no postees un link a una página, la gente pregunta por que se supone ya han leido. Simplemente no respondas hasta que llegue alguien que si sepa además de que quiera explicar.


Version Actual GoearPSP: Descontinuado

http://dev.cristian.lizana.in/

Ya, si por eso lo pregunto

Ya, si por eso lo pregunto xD, porque lo he estado mirando y no acabo de entender para que sirven XDD.

Imagen de clizana

Sirven

Las corutinas en lua serían lo que en otros lenguajes se llaman hilos o threads en inglés. (Si quieres saber técnicamente que es busca threads o hilos en google)

Sirven para dejar ejecutando procesos detrás (background, nose como traducir eso mejor) de lo que estas ejecutando en el momento.

¿Con qué fin te preguntaras?

Optimización ya que al ejecutar algún procedimiento en una corutina estás ejecutando eso además del codigo que llamó a la corutina, sin necesidad de esperar a que termine (como una función), capturando alguna señal que indique si se ejecuto correctamente o no.

 

Un ejemplo más claro:

Si quiero calcular 5 operaciones matemáticas mas o menos complejas puedo crear funciones y ejecutarlas mediante corutinas al mismo tiempo todas y entregando los resultados cuando vayan terminando, a diferencia de hacerlo mediante simples funciones lineales que deben esperar a que se termine para ejecutar la siguiente.

 

Espero haberte ayudado.


Version Actual GoearPSP: Descontinuado

http://dev.cristian.lizana.in/

Imagen de DeViaNTe

Lamento no corroborar eso xD

Lamentandolo mucho, LUA no permite multi-threading o multitask. Básicamente por su estructura de programación. Sigue una linealidad. Siempre ejecutará el proceso de inicio a fin.

Como implementar de alguna manera el multi-threading?
Se inventaron una manera, de crear puntos de entrada y salida a funciones. Es una imitación de lo que sería el multi-threading.

Por ejemplo, yo tengo este código:

function funcion1
while true do
  screen.print("molo mazo");
end
end

function funcion2
while true do
  screen.print("yo tb");
end
end

funcion1();

El resultado seria:
molo mazo
molo mazo
molo mazo
....

Ejecutando cualquiera de las dos funciones, entrariamos en un bucle infinito, y solo mostraria una frase. Implementando corutinas:

function funcion1
while true do
  screen.print("molo mazo");
  coroutine.yield();
end
end
function funcion2
mirutina = coroutine.create(funcion1);
while true do
  coroutine.resume(mirutina);
  screen.print("yo tb");
end
end

funcion2();

El resultado seria:
molo mazo
yo tb
molo mazo
yo tb
...

Por que? Són dos bucles cerrados. Pero fijaros, coroutine.create(funcion1) dice que la funcion1 será una corutina. coroutine.resume(xxx) ejecuta dicha función, PERO cuando encuentre un coroutine.yield() saldrá fuera de esa función, esté donde esté. Entonces seguiría ejecutandose funcion2, al iniciar el siguiente ciclo del bucle, volveria a encontrarse un coroutine.resume(), pero esta vez NO iniciará la función de nuevo, si no que volverá a entrar donde salió, y seguira el bucle, hasta volver a encontrar un coroutine.yield() que la haga salir, o encuentre el final de la funcion.

No se si se ha entendido bien, pero esta es mi manera de explicar las corutinas.

Para hacer multi-threading solo en lua, el mismo eboot tendría k crear dos threads distintos, y en cada uno cargar un lua distinto, pero ahi ya no sé que puede llegar a pasar, los dos intentando acceder a la parte gráfica, la wifi, el sonido... posiblemente petara. Si que se podría hacer un lua que no accediera a la parte gráfica, y otro que si... pero eso ya sería complicar demasiado la cosa, y el lua pretende ser un lenguaje sencillo... o eso creo... :)

Saludos
 Dev.


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Haber si lo he entendido

Soy nuevo en esto asi lo explicare como lo he entendido con mis palabras XD.

Es decir que yo pongo por ejemplo unarutina = coroutine.create(funcion1), si luego pongo  coroutine.resume(unarutina) ejecutara esa funcion, pero en vez de que el programa espere a que termine de ejecutarse esa funcion ,continua leyendo el codigo mientras que se ejecuta esa funcion, si luego pusiera  coroutine.yield(), esa corrutina entraria en "suspension" por decirlo de alguna manera y al volver a ejecutar  coroutine.resume() volveria a iniciarse donde se quedo en suspension no?? Ah y otra duda, coroutine.yield() deberia ir dentro de la funcion ejecutada como corrutina no? corregidme si me equivoco en algo xD, ah y muchas gracias por vuestra ayuda, deviante y clizana , por cierto muy weno el programa de GOEAR xD.

Imagen de DeViaNTe

a la vez no

no, a la vez no continua leyendo codigo, si no que en el coroutine.resume, se para, ejecuta la otra, hasta el final, o hasta que se encuentra un coroutine.yield, que es el punto de salida/entrada, así que no se ejecutan a la vez, si no, entra en una funcion y luego sale y sigue donde estabamos... permite la entrada/salida donde queramos de funciones, pero nunca simutaneidad.


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de DeViaNTe

exacto

luego si vuelves a poner coroutine.resume() te imprimirá un 3, y luego si lo vuevles a llamar, nada, pq habrá akabado, y lo sabrás pq en su status verás "dead".


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Gracias

Ok muchas gracias, tambien me gustaria saber una ultima cosa y ya os dejo en paz XD, en Lua hM 9 v2, se pueden usar las olas VLF si se pudiera me podrias decir como se haria o como se ejecutan los modulos ??? Si lo veis muy complicado para mi decidmelo y mejor seguire como estoy xDD.

Imagen de DeViaNTe

Nope.

Las olas no se pueden hacer en luahmv2, pero existe una especie de modulo para luapge, pero tendrías que adaptar el codigo a luahmv2. Saludos.


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Entiendo

Entnces esto,

co = coroutine.create( function ()

for i = 1, 3 do

print( i )

coroutine.yield()

end

end )

coroutine.resume( co )--Esto se ejecutaria hasta coroutine.yield() (Imprimiendo 1 )

coroutine.resume( co )--Si lo vuelvo a poner continua desde coroutine.yield()  hasta el siguiente coroutine.yield()  , imprimiendo 2 ,etc

Imagen de clizana

.

Ahi está mas claro que el agua

:P

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.