Autor Tema: no me aclaro con las id y asesinatos de procesos...  (Leído 2226 veces)

Futu-block

  • Hero Member
  • *****
  • Mensajes: 2762
  • Karma: 34
  • Superviviente marciano
    • futublock
no me aclaro con las id y asesinatos de procesos...
« en: Diciembre 08, 2010, 06:52:08 pm »
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

  • Sr. Member
  • ****
  • Mensajes: 402
  • Karma: 10
  • Doc! Doc! Una fotito antes de volver al futuro :D
Re: no me aclaro con las id y asesinatos de procesos...
« Respuesta #1 en: Diciembre 08, 2010, 07:17:44 pm »
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

  • Hero Member
  • *****
  • Mensajes: 2762
  • Karma: 34
  • Superviviente marciano
    • futublock
Re: no me aclaro con las id y asesinatos de procesos...
« Respuesta #2 en: Diciembre 08, 2010, 08:11:10 pm »
entonces, para crear ahora algun proceso hay que hacer:
[code language="bennu"]id_proceso_a_matar = procesoCualquiera();[/code]
¿no?



Noivern

  • Sr. Member
  • ****
  • Mensajes: 402
  • Karma: 10
  • Doc! Doc! Una fotito antes de volver al futuro :D
Re: no me aclaro con las id y asesinatos de procesos...
« Respuesta #3 en: Diciembre 08, 2010, 08:27:19 pm »
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

  • Hero Member
  • *****
  • Mensajes: 6273
  • Karma: 160
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re: no me aclaro con las id y asesinatos de procesos...
« Respuesta #4 en: Diciembre 09, 2010, 12:56:27 am »
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

  • Hero Member
  • *****
  • Mensajes: 2762
  • Karma: 34
  • Superviviente marciano
    • futublock
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #5 en: Enero 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:

Código: [Seleccionar]
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

  • Sr. Member
  • ****
  • Mensajes: 278
  • Karma: 9
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #6 en: Enero 29, 2018, 11:15:29 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:

Código: [Seleccionar]
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.

Drumpi

  • Hero Member
  • *****
  • Mensajes: 6273
  • Karma: 160
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #7 en: Febrero 03, 2018, 01:18:49 am »
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

  • Hero Member
  • *****
  • Mensajes: 2762
  • Karma: 34
  • Superviviente marciano
    • futublock
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #8 en: Febrero 03, 2018, 01:32:37 pm »
Lol,

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



Arcontus

  • Sr. Member
  • ****
  • Mensajes: 278
  • Karma: 9
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #9 en: Febrero 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?

Código: [Seleccionar]
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.
« última modificación: Febrero 09, 2018, 08:49:10 am por Arcontus »

Futu-block

  • Hero Member
  • *****
  • Mensajes: 2762
  • Karma: 34
  • Superviviente marciano
    • futublock
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #10 en: Febrero 09, 2018, 11:05:38 am »
En un momento dado te puedes cerciorar con un exists, pregunta si existe, usas usas sus datos
« última modificación: Febrero 09, 2018, 04:45:44 pm por Futu-block »



Arcontus

  • Sr. Member
  • ****
  • Mensajes: 278
  • Karma: 9
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #11 en: Febrero 09, 2018, 11:48:56 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.

Futu-block

  • Hero Member
  • *****
  • Mensajes: 2762
  • Karma: 34
  • Superviviente marciano
    • futublock
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #12 en: Febrero 09, 2018, 04:46:17 pm »
tu sabe, con los punteros me vuelvo loco ;)



Arcontus

  • Sr. Member
  • ****
  • Mensajes: 278
  • Karma: 9
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #13 en: Febrero 09, 2018, 07:17:23 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?

Código: [Seleccionar]
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 :)

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12756
  • Karma: 375
Re:no me aclaro con las id y asesinatos de procesos...
« Respuesta #14 en: Febrero 12, 2018, 08:13:46 pm »
no espera nada, el onexit se ejecuta inmediatamente... mira estos ejemplos...

ejemplo 1 (kill externo)

Código: [Seleccionar]
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

Citar
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)

Código: [Seleccionar]
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:

Citar
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