no me aclaro con las id y asesinatos de procesos...

Started by Futu-block, December 08, 2010, 06:52:08 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

pos eso, que no lo tengo claro, ya que osk me pone un ejemplito que no me termino de enterar...
no se cuando hay que poner el identificador, ni como se pone, ni pa que vale ni como matarlo...


un ejemplito mas o un enlace plis???

Noivern

con signal matas un proceso, teniendo su id:
id_proceso_a_matar = procesoCualquiera();
signal(id_proceso_a_matar, S_KILL);

Pero debes prestar cuidado a que esa id sea válida, ya que si no existe se te cerrará el juego por error durante runtime.
Para evitar esto puedes usar la funcion exists() para comprobar antes que exista dicho proceso:

if (exists(id_proceso_a_matar))
  signal(id_proceso_a_matar, S_KILL);
end

Además debes tener cuidado de no intentar acceder al proceso despues de muerto, asi que el exists() es de mucha ayuda con ello!

Futu-block

entonces, para crear ahora algun proceso hay que hacer:
[code language="bennu"]id_proceso_a_matar = procesoCualquiera();[/code]
¿no?

Noivern

si, para matar un proceso en particular.
Si lo que quieres es matar a TODOS los procesos del mismo tipo se usa el TYPE:

signal(TYPE tuTipoDeProceso, S_KILL);

Drumpi

id_proceso=mi_proceso();

Es una forma de obtener su ID. Todos los procesos tienen también su ID en la variable local predefinida ID, que puedes copiarla en cualquier variable global que tengas.
Otra forma de obtener la ID es con:
id_proceso=get_id(type mi_proceso);
Que te devuelve la ID de un proceso cualquiera de ese tipo que exista (o cero si no hay). Si vuelves a llamar a GET_ID, te dará otra ID de otro proceso de ese tipo, hasta que te los diga todos (momento en el que empieza a devolver creo) o hagas un FRAME (que se reinicia y vuelve a darte de nuevo los valores desde el principio).

Pero lo mejor es obtener la ID de un proceso nada más crearlo. Ojo, esta asignación tiene lugar tras el FRAME del proceso creado (lo digo por si ese mismo proceso tiene que leer dicha variable, que aun valdrá cero o lo que valiese antes).

También puedes enviar señales como S_FREEZE (que detiene el proceso y muestra su gráfico, con sus características de size, angle y demás, que pueden modificarse desde otros procesos), S_SLEEP (que detiene el proceso y NO muestra su gráfico), S_WAKEUP (que despierta un proceso dormido/congelado), y sus variaciones _TREE, como S_KILL_TREE que mata a un proceso y todos aquellos que haya generado (sus hijos), o S_SLEEP_TREE, S_WAKEUP_TREE...
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)

Futu-block

Reabro mi propio hilo, mas que ná porque no encuentro uno especifico que ponía ''procesos que se auto matan'' o algo asi y lo que voy a preguntar igual se responde solo...

¿como conseguir que un proceso se suicide?
Yo lo tengo asi y creo que es valido:


proces revienta()
private
int c;
begin
    graph = 1;
    for (c=1; c < 100; c++)
        size++;
        frame 25;
    end
end



creo que si el proceso llega a su fin, se muere... de pena, ¿no?

Arcontus

Quote from: Futu-block on January 29, 2018, 11:02:40 PM
Reabro mi propio hilo, mas que ná porque no encuentro uno especifico que ponía ''procesos que se auto matan'' o algo asi y lo que voy a preguntar igual se responde solo...

¿como conseguir que un proceso se suicide?
Yo lo tengo asi y creo que es valido:


proces revienta()
private
int c;
begin
    graph = 1;
    for (c=1; c < 100; c++)
        size++;
        frame 25;
    end
end



creo que si el proceso llega a su fin, se muere... de pena, ¿no?
Claro, en cuanto el proceso termina su bucle principal finaliza. Si no hubiera bucle principal el proceso terminaría tras ejecutar sus instrucciones.
Por otro lado y si no estoy confundido, en el caso de que no hubiera bucle principal o mejor dicho instruccion FRAME, lo más adecuado es utilizar una función en lugar de un proceso ya que te aseguras de que se complete antes de retornar al proceso padre que la invocó (creo recordar que esta era la diferencia). Pero vamos, esto es algo de hilar muy fino y por las preguntas que haces creo que no necesitas estos detalles.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Drumpi

Que yo recuerde, las únicas formas de que un proceso se suicide son las que ya se han dicho: que llegue al END del PROCESS, que se ejecute un RETURN (en cuyo caso, hablamos de una FUNCTION, y luego la drástica: SIGNAL(ID, S_KILL)

También le puedes decir que está siendo programada para un juego tuyo, creo que suele ser bastante eficaz :D :D :D
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)

Futu-block

Lol,

if (process != Auto kill)
    Process know is working in my game
End

Arcontus

#9
Aprovechando el hilo quiero hacer una pregunta:

Si tengo dos procesos A y B donde B recibe un puntero de A para controlar cuando el proceso A muere, y A modifica el valor de la variable en el apartado onExit ¿le dará tiempo a B de enterarse?


PROCESS b(int *salir)
BEGIN
    while((*salir) == 0)
        FRAME;
    END
END

PROCESS a()
PRIVATE
    int salir;
END
BEGIN
    salir = 0;
    b(&salir);
    LOOP
        FRAME;
    END
OnExit:
    salir = 1;
END

...
signal_skill(id_a, s_kill);
...


Cual es mi duda: que lanzando un "signal(id a, S_KILL)" cuando el proceso b quiera comprobar la variable "*salir" el proceso A, A ya no exista y por tanto tenga punteros locos.
Es decir, una vez ejecutado "OnExit"¿se espera el proceso por así decirlo 1 frame, por si otros procesos debieran consultar datos antes de morirse?

Por las pruebas que he estado haciendo no he visto problemas en usar ese método así que parece que sí espera, lo cual es lo deseable al menos en mi caso, pero quiero estar totalmente seguro de estar haciendolo bien.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Futu-block

#10
En un momento dado te puedes cerciorar con un exists, pregunta si existe, usas usas sus datos

Arcontus

Quote from: Futu-block on February 09, 2018, 11:05:38 AM
En un momento dado te puedes serciorar con un exists, pregunta si existe, usas usas sus datos
Si, se que hay maneras para saber si un proceso está vivo, pero esa no es la pregunta.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Futu-block


Arcontus

Quote from: Arcontus on February 08, 2018, 11:08:07 PM
Aprovechando el hilo quiero hacer una pregunta:

Si tengo dos procesos A y B donde B recibe un puntero de A para controlar cuando el proceso A muere, y A modifica el valor de la variable en el apartado onExit ¿le dará tiempo a B de enterarse?


PROCESS b(int *salir)
BEGIN
    while((*salir) == 0)
        FRAME;
    END
END

PROCESS a()
PRIVATE
    int salir;
END
BEGIN
    salir = 0;
    b(&salir);
    LOOP
        FRAME;
    END
OnExit:
    salir = 1;
END

...
signal_skill(id_a, s_kill);
...


Cual es mi duda: que lanzando un "signal(id a, S_KILL)" cuando el proceso b quiera comprobar la variable "*salir" el proceso A, A ya no exista y por tanto tenga punteros locos.
Es decir, una vez ejecutado "OnExit"¿se espera el proceso por así decirlo 1 frame, por si otros procesos debieran consultar datos antes de morirse?

Por las pruebas que he estado haciendo no he visto problemas en usar ese método así que parece que sí espera, lo cual es lo deseable al menos en mi caso, pero quiero estar totalmente seguro de estar haciendolo bien.

¿Alguien sabe si esto es correcto?

Gracias por adelantado :)
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

no espera nada, el onexit se ejecuta inmediatamente... mira estos ejemplos...

ejemplo 1 (kill externo)

import "mod_say";
import "mod_proc";
import "mod_key";

process a()
begin
    while(1)
        say("A frame...");
        frame;
        say("A continua...");
    end
onexit:
    say("A muerto!");

end

process b()
begin
    while(1)
        say("B frame...");
        frame;
        say("B continua...");
    end
onexit:
    say("B muerto!");
end


private
    pa, pb, i;
begin

    pa = a();
    pb = b();

    for ( i = 0; i < 4; i++)
        if ( i == 2 )
            say("main kill B...");
            signal(pb,s_kill);
        end
        say("main frame...");
        frame;
        say("main continua...");
    end

    let_me_alone();

end


resultado

Quote
A frame...
B frame...
main frame...
main continua...
main frame...
B continua...
B frame...
A continua...
A frame...
main continua...
main kill B...
main frame...
B muerto!
A continua...
A frame...
main continua...
main frame...
A continua...
A frame...
main continua...
A muerto!

ejemplo 2 (auto kill)


import "mod_say";
import "mod_proc";
import "mod_key";

process a()
private
    i;
begin
    while(1)
        i++;
        if ( i == 2 )
            say("A auto kill...");
            signal(id,s_kill);
        end
        say("A frame...");
        frame;
        say("A continua...");
    end
onexit:
    say("A muerto!");

end

process b()
begin
    while(1)
        say("B frame...");
        frame;
        say("B continua...");
    end
onexit:
    say("B muerto!");
end


private
    pa, pb, i;
begin

    pa = a();
    pb = b();

    for ( i = 0; i < 4; i++)
        say("main frame...");
        frame;
        say("main continua...");
    end

    let_me_alone();

end


resultado:

Quote
A frame...
B frame...
main frame...
main continua...
main frame...
B continua...
B frame...
A continua...
A auto kill...
A muerto!
main continua...
main frame...
B continua...
B frame...
main continua...
main frame...
B continua...
B frame...
main continua...
B muerto!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2