|
|||||||
| Avisos |
![]() |
|
|
|
Herramientas | Calificar Tema | Desplegado |
|
#1
|
||||
|
||||
|
Suicidio de un proceso y ONEXIT
Hola chicos,
Tengo una duda, es mejor que un proceso se suicide o que sea el padre el que se encargue de matarle? lo del suicidio, en el manual de fenix en los ejemplos lo suele hacer haciendo un "return" en cualquier punto del codigo que quieras que se suicide. Pero haciendo un "return" ejecutara lo que hay en el ONEXIT? O si en lugar de un return, dejamos que se salga de su bucle principal, morira no? pero ejecutara el codigo del ONEXIT? Por si afecta, estoy hablando de fenix 092a. Aiken
__________________
|
|
#2
|
||||
|
||||
|
siempre que muere un proceso que tiene onexit, sea como sea que muere/finaliza, se ejecuta el onexit... lo hice yo...
![]() |
|
#3
|
||||
|
||||
|
Cita:
Código:
proceso pepito() private int cuenta; end begin graph=1; cuenta=0; loop cuenta++; if (cuenta>10) return; end frame; end onexit: unload_map(); end en Bennu tambien? Aiken
__________________
|
|
#4
|
||||
|
||||
|
No sabía que un proceso podía usar return
¿Se puede hacer también una llamada del estilo resultado = mi_proceso(); ? ¿El proceso que llama se paraliza hasta que el otro llega al return, igual que si hubiera llamado a una función?Yo siempre usaba signal(id,s_kill); ![]()
__________________
|
|
#5
|
||||
|
||||
|
Cita:
si haces eso, te creara un nuevo proceso de tipo mi_proceso y te devolvera su id en la variable. el return lo usan como break por asi decirlo. Aiken
__________________
|
|
#6
|
||||
|
||||
|
Tienes toda la razón del mundo, me estoy releyendo y no comprendo cómo he preguntado esa tontería tan gorda (que además he usado miles de veces) xD
__________________
|
|
#7
|
||||
|
||||
|
Lo único que puedo aportar es que en DIV2 tenia un proceso que creaba un hijo, y al matar el padre el hijo moria automaticamente, en Bennu no moria el hijo, he tenido antes de matar el padre, matar el hijo
![]() |
|
#8
|
||||
|
||||
|
Cita:
La pregunta importante es, si muere el padre y el proceso main ¿quien adopta a los procesos huérfanos?
__________________
![]() PROYECTOS REALIZADOS: FrikiMusic, Motor Scroll Tileado v3.2, Venturer2X (GP2X/WIZ), Echo, Screen Break Time PROYECTOS EN MARCHA (algunos): Bennu GP2X: 95% (necesito ayuda) ¡Antes de Halloween!: 92% SpaceH2H: 8% |
|
#9
|
||||
|
||||
|
Es más, en Bennu sino mataba el hijo el programa hacia crash, era el motivo por el cual al matar un enemigo que lanza una hacha y esta estaba en pantalla el juego petaba...
|
|
#10
|
||||
|
||||
|
Eso es que el hijo leía alguna variable del difunto padre, seguro ¿has mirado el mensaje de error? seguro que es algo del estilo "no se encuentra el proceso (xxxx)".
__________________
![]() PROYECTOS REALIZADOS: FrikiMusic, Motor Scroll Tileado v3.2, Venturer2X (GP2X/WIZ), Echo, Screen Break Time PROYECTOS EN MARCHA (algunos): Bennu GP2X: 95% (necesito ayuda) ¡Antes de Halloween!: 92% SpaceH2H: 8% |
|
#11
|
||||
|
||||
|
si, porque la hacha volvia al enemigo y pasado algun tiempo la vuelve a lanzar
![]() No lo miré porque ejecuto con un bat y la pantalla no se queda en pantalla al salir, pero tampoco importa eso lleva ya tiempo solucionado ![]() Ha sido sólo a titulo de nota ![]() |
|
#12
|
||||
|
||||
|
Cita:
Cita:
No has preguntado ninguna estupides, es una pregunta perfecta. Cita:
Eso no deberia ser correcto, DIV tenia procesos padres.... ahhhhh, ya veo, ahora me doy cuenta mientras escribo.... seguro que div tenia algun chequeo que si se intentaba usar una variable de otro proceso muerto, el proceso que intentaba hacerlo moria... |
|
#13
|
||||
|
||||
|
Cita:
Al menos a partir de Fenix ya lo indicaba con un error. Por cierto, aun falta por responder a mi tontería: si a un proceso se le muere el padre, y muere el proceso main ¿queda totalmente huérfano o pasa a depender de otro porceso?
__________________
![]() PROYECTOS REALIZADOS: FrikiMusic, Motor Scroll Tileado v3.2, Venturer2X (GP2X/WIZ), Echo, Screen Break Time PROYECTOS EN MARCHA (algunos): Bennu GP2X: 95% (necesito ayuda) ¡Antes de Halloween!: 92% SpaceH2H: 8% |
|
#14
|
||||
|
||||
|
Te cuento a lo que mi entender ocurre:
Al morir el padre, las señales que el hijo lea o le envie al padre que ya no existe, son tratadas y no devuelven error, por eso DIV no peta, caso similar a mi parecer es el tema de que te hable antes sobre hacer unload de un sonido inexistente, en DIV tampoco devuelve error, y seguramente existan más cosas en que ocurre la misma diferencia, o sea, en que div esto se trata de una forma en que el programador ni se entera que tendria un error ahí por ese motivo de inexistencias ![]() Ahora ya depende de ti lo que se tiene que tratar como error o no, en mi opinion como Bennu es más explicito y detalla más las distintas formas de actuar, esto deberia quedar tal cual lo tienes actualmente, porque si por ejemplo esto te parece que se tenga que tratar como en DIV lo de los sonidos seria igual y muchas más cosas... Esto esta en el hijo, y son las condiciones que matan al hijo, y al contrario de lo que supone Splinter (y yo en el primer mensaje ), en DIV, al morrir el padre el hijo no muere, sencillamente ignora las señales del padre, y en este caso sólo va morir cuando se ejecute el ultimo IF, o sea, cuando salga de la pantalla (mapa).IF (father.flags == 0) IF (x < father.x) father.estado = 0; BREAK; END ELSE IF (x > father.x) father.estado = 0; BREAK; END END IF (x > 5100 OR x < -100) BREAK; END < - > 2 - He estado haciendo pruebas, yo estaba matando el hijo antes de morrir el padre para solucionarlo en Bennu, pero lo ideal es que quedará como en DIV, o sea. si mato el padre, la hacha que lanza sigue en pantalla y sólo va desaparecer cuando salga de pantalla (como en la realidad si el enemigo fuera real ).He estado buscando y los foros de Bennu, y me entero que seria posible, si antes de aceder a las propriedades del padre comprobamos que este sigue activo, o sea, con: existe_padre = exists(inimigo3(x, y)); comprueba que el padre existe o con existe_padre = get_id(inimigo3(x, y)); devuelve 0 si el padre no existe y despues si esta flag es verdadera acedemos al padre, si no lo es no lo hariamos. El problema es que cuando pongo una o otra me crea un padre nuevo!!!! O sea, cada vez que se ejecuta esto en el hijo este me crea un padre más... Esto es un Bug o es que estoy haciendo mal la llamada de exists o get_id ?? Última edición por GameMaster fecha: 22/11/2009 a las 09:39. Razón: Edición automática anti doble-post. |
|
#15
|
||||
|
||||
|
Es que al hacer:
existe_padre = exists(inimigo3(x, y)); Estás creando un nuevo proceso. Debes hacer el exists con la ID del proceso que quieres comprobar. Creo que en tu caso es father (supongo que sabes lo que es). Respecto a cómo actuaba DIV respecto a acceder a variables de procesos muertos, no se si es que me ignoras o te expresas fatal, porque creí haber dicho que DIV se cerraba sin decir nada. Y si matas a un proceso, sus hijos no tienen por qué morir, a menos que hagas un s_kill_tree, los hijos siguen activos y se convierten en hijos del proceso main. Lo que ya no se es si esos procesos hijo toman la ID del main en sus variables locales father, que creo que no.
__________________
![]() PROYECTOS REALIZADOS: FrikiMusic, Motor Scroll Tileado v3.2, Venturer2X (GP2X/WIZ), Echo, Screen Break Time PROYECTOS EN MARCHA (algunos): Bennu GP2X: 95% (necesito ayuda) ¡Antes de Halloween!: 92% SpaceH2H: 8% |
![]() |
| Herramientas | |
| Desplegado | Califica este Tema |
|
|