dudas on_exit

Started by Trecek, August 04, 2011, 09:44:32 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Trecek

Ok, muchas gracias. Espero no tener que daros mas la tabarra cuando empiece a usar unloads ;)

Arcontus

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!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

un proceso que hace colision contra si mismo??? como es eso posible drumpi?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Haciendo deformación a la imagen y una de las puntas toca en la otra punta del mismo  ;D

Arcontus

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".
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

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.

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Trecek

#23
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.

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Trecek

Ok, gracias por aclararmelo splinter, supongo que aun pienso en muchas cosas desde el punto de vista del div, en fin, poco a poco :)

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Trecek

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.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2