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.
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.
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.
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... :)
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.
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.
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".
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.
aqui tienes todo lo que
aqui tienes todo lo que quieras saber
http://pipagerardo.fortunecity.es/Tutorial_LUA_PSP_pipagerardo.html
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.
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/
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.
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
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.
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
.
Ahi está mas claro que el agua
:P