Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Trecek on August 04, 2011, 09:44:32 AM

Title: dudas on_exit
Post by: Trecek on August 04, 2011, 09:44:32 AM
Cito del manual de Oscar: "Se recomienda usar la cláusula on_exit en una función/proceso, para liberar aquellos recursos reservados por ésta." (Pag.63)
No he encontrado nada mas en el manual, ni tampoco en la wiki. (Sera que no lo he sabido buscar?)
Disculparme si pregunto algo que ya se ha explicado en otro post, tambien he buscado por el foro, pero solo he encontrado un ejemplo en un post en el que hablaban de otra cosa, y no me sirve.

Hasta donde yo entiendo, cada proceso ejecutara las instrucciones que tenga entre el on_exit y el final del proceso justo antes de terminarse el proceso(idem para funciones).Me equivoco?

Mis dudas son:
-Cual es su sintaxis? necesita end, o solo con poner on_exit antes del end//begin ya vale? (con su codigo entre medias, claro)
-Segun el manual de Oscar esta instruccion es util para liberar recursos. unload fpg y demas (o como se ponga, ya lo mirare) la cuestion es: una vez el proceso muere, el espacio de memoria ocupado por sus variables privadas se libera? o seria conveniente liberarlo tambien? supongo que no hace falta, pero yo que se, dudas de novato. Aparte de fpgs que otras cosas se pueden "unlodear"? fnts? sonidos? joer, en esto estoy muy verde.

Agradecere infinitamente (o al menos hasta que se me olvide) cualquier explicacion acerca de on_exit y liberacion de recursos.
Title: Re: dudas on_exit
Post by: Trecek on August 04, 2011, 09:56:21 AM
Acabo de encontrar on_exit en la wiki, sorry, no debi de buscar bien  :-[

Aun asi tengo dudas acerca de que recursos conviene liberar al terminar un proceso, aparte de maps y fpgs (si los hay). Gracias por adelantado.
Title: Re: dudas on_exit
Post by: kim-elet-o on August 04, 2011, 10:16:44 AM
No, no te equivocas, solo añadir que si el proceso es "terminado" por otro proceso tambien se ejecutan las intrucciones que halla dentro de la clausula. La sintatica de On_Exit es la siguiente:

Process unProceso()
   Begin

   // codigo fuente del proceso.
   
   On_Exit

   // Codigo fuente de On_exit.

   End

Se liberan sus variables, pero no los recursos cargados en memoria, con lo cual si con un proceso cargas recursos, y te interesa liberarlos cuando acabe dicho proceso, este es el lugar ideal para hacerlo, fuente, sonidos, memoria dinamica, demas recursos que se carguen en memoria. Poco a poco, nadie nace enseñado, BennuGD es grande, pero como dijo Jack el destripador, "vayamos por partes".

Tambien es util aqui incluir codigo que haga acciones que se deban realizar siempre que se termine un proceso, por ejemplo imagina que tienes un proceso que sea un marcianito, y cuando este sea destruido se deba genera una explosion que podria ser tambien otro proceso, pues aqui es el sitio donde llamaras al proceso explosion, imaginacion al poder.
Title: Re: dudas on_exit
Post by: Trecek on August 04, 2011, 10:25:50 AM
Lo de poner ahi codigo que se deba ejecutar siempre cuando termine el proceso lo sabia, de hecho para eso pretendo utilizarlo ;) lo que me preocupaba un poco era si al terminar los procesos se liberaba el espacio reservado a las variables, porque estoy metiendo unas peazo tablas enormes tipo base de datos, en fin, bueno es saber que no me tengo que preocupar por eso.

Asi que los recursos que debiera "unlodear" serian, fpgs, maps, fuentes y sonidos? alguno mas?

Gracias por la explicacion kim-elet-o, mas o menos me hacia una idea, pero me gusta ir sobre seguro si puedo :)
Title: Re: dudas on_exit
Post by: kim-elet-o on August 04, 2011, 11:21:41 AM
Tambien videos, mapas generados en tiempo de ejecucion, ahora no me acuerdo de mas cosas, pero piensa que todo lo que sean recursos externos que se carguen en memoria son candidatos a ser descargados.

Title: Re: dudas on_exit
Post by: Trecek on August 04, 2011, 12:02:08 PM
Bueno, creo que me hago a una idea.

De momento no he necesitado ningun unload, ya que estoy haciendo las diferentes partes del programa por separado (una seccion=un programa) cuando las una todas en un solo programa ya me tocara cargar y descargar fpgs, sonidos y demas cuando pase de una seccion a otra, asi que claro, me interesaba saber mas o menos como va eso, gracias por las explicaciones :)

Karma
Title: Re: dudas on_exit
Post by: kim-elet-o on August 04, 2011, 12:21:02 PM
Encantado de ayudar.
Title: Re: dudas on_exit
Post by: SplinterGU on August 04, 2011, 03:07:08 PM
karma kim!
Title: Re: dudas on_exit
Post by: Drumpi on August 04, 2011, 06:28:53 PM
Aunque se ha dicho, se ha pasado muy por encima: liberar la memoria ocupada por punteros. Es para lo que mejor viene on_exit y se suele olvidar.
Title: Re: dudas on_exit
Post by: SplinterGU on August 04, 2011, 06:44:33 PM
Quote from: Drumpi on August 04, 2011, 06:28:53 PM
Aunque se ha dicho, se ha pasado muy por encima: liberar la memoria ocupada por punteros. Es para lo que mejor viene on_exit y se suele olvidar.

ya lo habia dicho kim.

Quote from: kim-elet-o on August 04, 2011, 10:16:44 AM
No, no te equivocas, solo añadir que si el proceso es "terminado" por otro proceso tambien se ejecutan las intrucciones que halla dentro de la clausula. La sintatica de On_Exit es la siguiente:

Process unProceso()
   Begin

   // codigo fuente del proceso.
   
   On_Exit

   // Codigo fuente de On_exit.

   End

Se liberan sus variables, pero no los recursos cargados en memoria, con lo cual si con un proceso cargas recursos, y te interesa liberarlos cuando acabe dicho proceso, este es el lugar ideal para hacerlo, fuente, sonidos, memoria dinamica, demas recursos que se carguen en memoria. Poco a poco, nadie nace enseñado, BennuGD es grande, pero como dijo Jack el destripador, "vayamos por partes".

Tambien es util aqui incluir codigo que haga acciones que se deban realizar siempre que se termine un proceso, por ejemplo imagina que tienes un proceso que sea un marcianito, y cuando este sea destruido se deba genera una explosion que podria ser tambien otro proceso, pues aqui es el sitio donde llamaras al proceso explosion, imaginacion al poder.

despues soy yo el que no leo... :D
Title: Re: dudas on_exit
Post by: Drumpi on August 04, 2011, 06:46:18 PM
Quote from: Drumpi on August 04, 2011, 06:28:53 PM
Aunque se ha dicho, se ha pasado muy por encima: liberar la memoria ocupada por punteros. Es para lo que mejor viene on_exit y se suele olvidar.
Title: Re: dudas on_exit
Post by: Trecek on August 05, 2011, 06:23:53 AM
Jajajajajaa, haya paz chicos.

De momento no estoy usando punteros, pero tomo nota, gracias :)

Asi pues... fpgs, fnts, sonidos, videos, punteros, maps... me dejo algo?
Title: Re: dudas on_exit
Post by: Drumpi on August 05, 2011, 05:31:56 PM
Procesos hijos.
En general, cualquier comando que use LOAD_* o NEW_* (o se invoque a cualquier proceso que se quede en memoria) necesita ser descargado, ya sea en on_exit o en el propio código.

Eso sí, los verdaderos hombres no usan on_exit (y programan en PaintBrush).
Nah, es broma, pero si eres capaz de no usarlo, no tendrás ningún problema en el resto de lenguajes, pero es más un reto personal que una recomendación: en un sistema basado en procesos como es Bennu, on_exit es hasta necesario.
Title: Re: dudas on_exit
Post by: KeoH on August 06, 2011, 01:38:01 AM
otra funcion q es una maravilla y q debe estar en el On_exit es:   signal(id, s_kill_tree);

xDDD me encanta :)
Title: Re: dudas on_exit
Post by: SplinterGU on August 06, 2011, 02:03:32 AM
Quote from: KeoH on August 06, 2011, 01:38:01 AM
otra funcion q es una maravilla y q debe estar en el On_exit es:   signal(id, s_kill_tree);

xDDD me encanta :)

no siempre... ;)
Title: Re: dudas on_exit
Post by: Trecek on August 06, 2011, 06:48:51 AM
Ok, muchas gracias. Espero no tener que daros mas la tabarra cuando empiece a usar unloads ;)
Title: Re: dudas on_exit
Post by: Arcontus on August 08, 2011, 09:06:40 AM
Yo también tengo una duda que no se si con "on_exit" puedo solventarla.

Imaginemos que tenemos 3 procesos "A", "B" y "C". El proceso "A" es padre de "B" y "B" es padre de "C". "C" tiene un puntero a una variable de "A" y tanto "B" como "C" tienen una clausula para ejecutarse de la siguiente manera: "while(exists(father))".

Al terminar la partida uso un "signal(son,S_SLEEP_TREE);" en el main, un FRAME y un "let_me_alone();" al final.
Parece ser que "let_me_alone();" elimina el proceso "A" primero, y el proceso "C" da un error de ejecución petando el programa ya que debe tratar de acceder al contenido del puntero de "A" (pese a estar pausado) ya que "B" sigue existiendo.

¿Alguna idea de como finalizar ordenadamente?

Saludos!
Title: Re: dudas on_exit
Post by: SplinterGU on August 08, 2011, 02:21:47 PM
no debes tener los exists(father) correctamente, tenes que tener al menos 1 despues de cada FRAME, o antes de cada acceso a variable de father.
Title: Re: dudas on_exit
Post by: Drumpi on August 08, 2011, 04:43:16 PM
Pues eso, que seguramente accedes a un valor de FATHER sin haber comprobado previamente si existe tras el frame.

Por cierto ¿ONEXIT soporta el uso de frame? porque con mi versión de Bennu (r228) no me ejecuta la animación de muerte ni hace collision con el mismo.
Title: Re: dudas on_exit
Post by: SplinterGU on August 08, 2011, 05:36:59 PM
un proceso que hace colision contra si mismo??? como es eso posible drumpi?
Title: Re: dudas on_exit
Post by: FreeYourMind on August 08, 2011, 06:32:38 PM
Haciendo deformación a la imagen y una de las puntas toca en la otra punta del mismo  ;D
Title: Re: dudas on_exit
Post by: Arcontus on August 08, 2011, 08:46:05 PM
Quote from: SplinterGU on August 08, 2011, 02:21:47 PM
no debes tener los exists(father) correctamente, tenes que tener al menos 1 despues de cada FRAME, o antes de cada acceso a variable de father.

Creo que no se me entendió bien, el tema es que los valores no son del "padre" sino del "abuelo".
Title: Re: dudas on_exit
Post by: SplinterGU on August 08, 2011, 10:04:06 PM
es lo mismo... guardas el id del abuelo cuando creas el proceso y chequeas por ese id... o haces exists(father) y luego exists( father.father), pero ahi dependes que que el padre este presente.

Title: Re: dudas on_exit
Post by: Trecek on August 09, 2011, 07:22:24 AM
Si no me equivoco los procesos huerfanos pasan a ser hijos del abuelo. En otras palabras, si A es el father de B y B es el father de C, al morir  B, C pasa a ser son de A. En ultimo termino el proceso acabaria siendo hijo del main (corregirme si me equivoco, no suelo usar "familias").

Si tienes una clausula para ejecutarse de la siguiente manera: "while(exists(father))" en mi opinion esto se ejecutara SIEMPRE. Tal vez esto sea lo que te esta dando problemas. Si la variable a acceder esta en A, y le dices a C que acceda a una variable father.father if father exists, en el caso de que B haya muerto posiblemente trate de acceder a esa variable pero en el proceso padre de A, ya que al morir B, C pasa a ser hijo de A y entonces el father.father de C seria el father de A.

No se si me estoy columpiando o no. Mas que tratar de ayudar expongo lo que yo entiendo de este tema por ver si alguien me puede decir si estoy en lo cierto, es algo con el que no he trabajado aun, y me gustaria saber si lo he entendido bien o mal. Gracias, y disculpa si me he equivocado y te he liado mas arcontus.
Title: Re: dudas on_exit
Post by: Drumpi on August 09, 2011, 04:48:58 PM
Quote from: SplinterGU on August 08, 2011, 05:36:59 PM
un proceso que hace colision contra si mismo??? como es eso posible drumpi?

Perdón, eso de escribir de madrugada...
Quería decir que otros procesos no hacen colisión con el mismo, el que está en onexit (porque al no haber animación...).

Si un proceso muere, creo que los hijos pasan a depender del proceso main, la raiz de todos (vamos, que se queda huérfano y lo adopta la "madre universal" del programa). De ahí la importancia de pasar el ID del abuelo al nieto.
Title: Re: dudas on_exit
Post by: SplinterGU on August 09, 2011, 04:50:21 PM
Quote from: Trecek on August 09, 2011, 07:22:24 AM
Si no me equivoco los procesos huerfanos pasan a ser hijos del abuelo. En otras palabras, si A es el father de B y B es el father de C, al morir  B, C pasa a ser son de A. En ultimo termino el proceso acabaria siendo hijo del main (corregirme si me equivoco, no suelo usar "familias").

Si tienes una clausula para ejecutarse de la siguiente manera: "while(exists(father))" en mi opinion esto se ejecutara SIEMPRE. Tal vez esto sea lo que te esta dando problemas. Si la variable a acceder esta en A, y le dices a C que acceda a una variable father.father if father exists, en el caso de que B haya muerto posiblemente trate de acceder a esa variable pero en el proceso padre de A, ya que al morir B, C pasa a ser hijo de A y entonces el father.father de C seria el father de A.

No se si me estoy columpiando o no. Mas que tratar de ayudar expongo lo que yo entiendo de este tema por ver si alguien me puede decir si estoy en lo cierto, es algo con el que no he trabajado aun, y me gustaria saber si lo he entendido bien o mal. Gracias, y disculpa si me he equivocado y te he liado mas arcontus.

no, los procesos huerfanos, son huerfanos... hubo un par de releases de fenix que yo hice un cambio para que sean adoptados por el abuelo, pero eso estaba mal, asi que lo volvi a cambiar... un huerfano es un huerfano.
Title: Re: dudas on_exit
Post by: Trecek on August 10, 2011, 07:14:23 AM
Ok, gracias por aclararmelo splinter, supongo que aun pienso en muchas cosas desde el punto de vista del div, en fin, poco a poco :)
Title: Re: dudas on_exit
Post by: SplinterGU on August 10, 2011, 07:53:54 AM
hay una confusion, en div era igual, los abuelos no heradaban a sus nietos cuando un hijo moria.

Quote
Huérfano, proceso cuyo padre ha muerto (ha sido eliminado o a finalizado).

Y esta jerga se puede extender hasta donde llegue la imaginación, abuelos, nietos, tíos, etc.

Todos los procesos tienen acceso a los códigos identificadores de los procesos con los que tienen parentesco directo (ver: Formas de obtener el código identificador de un proceso).

En ocasiones, se hace referencia a acciones hechas por "el sistema"; este proceso, denominado div_main, es el que controla al resto, por tanto es el encargado de crear el proceso inicial al comienzo de la ejecución, de ajustar la velocidad de ejecución, el trazador, etc. Todos los procesos que se quedan huérfanos pasan a ser hijos de este proceso.

texto del help de div... los huerfanos no se heredan por el abuelo, los hereda internamente el root...
Title: Re: dudas on_exit
Post by: Trecek on August 10, 2011, 09:15:43 AM
Anda, asi que estaba equivocado con respecto a los parentescos del div tambien. Esto me pasa por confiar en mi memoria, que francamente deja mucho que desear. No soy muy aficionado a usar "familias" cuando programo (cuestion de gustos), no obstante viene bien saberlo, si no seguramente me hubiese vuelto loco si algun dia trataba de usar estos parentescos para conseguir ID-s. Gracias por la aclaracion splinter.
Title: Re: dudas on_exit
Post by: SplinterGU on August 10, 2011, 03:13:24 PM
de nada...