Autor Tema: [CODE] funcion para enviar signals globales y luego recuperar su estado original  (Leído 7133 veces)

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12887
  • Karma: 377
signal_misc.prg

Código: [Seleccionar]
import "mod_proc";

/* ---------------------------------- */

local
    saved_status ;
end

/* ---------------------------------- */

function save_state_and_signal( int pid, int sig )
begin
    if ( sig >= S_TREE )
        sig -= S_TREE;
    end

    if ( sig >= S_FORCE )
        sig -= S_FORCE;
    end

    if ( !pid )
        while ( pid = get_id(ALL_PROCESS) )
            if ( pid != id && pid != father )
                pid.saved_status = get_status( pid );
                signal( pid, S_FORCE + sig );
            end
        end
    else
        if ( pid != father )
            pid.saved_status = get_status( pid );
            signal( pid, S_FORCE + sig );
        end
    end
end

/* ---------------------------------- */

function restore_state( int pid )
begin
    if ( !pid )
        while ( pid = get_id(ALL_PROCESS) )
            if ( pid.saved_status > 0 && pid != id && pid != father )
                pid.reserved.status = pid.saved_status;
                pid.saved_status = 0;
            end
        end
    else
        if ( pid.saved_status > 0 && pid != father )
            pid.reserved.status = pid.saved_status;
            pid.saved_status = 0;
        end
    end
end

/* ---------------------------------- */

save_state_and_signal( int pid, int sig ) es igual a un signal, salvo que guarda el estado actual de cada proceso.

restore_state( int pid ) restaura el proceso/s indicado al estado antes de save_state_and_signal

es una estupides gigante, pero vi que muchos se complican con esto.
« última modificación: Septiembre 28, 2011, 07:19:31 am por SplinterGU »
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
He añadido al wiki este código, ahora bien, no se si está todo correctamente explicado, a ver si Sandman y josebita pueden revisar la "english grammar".
http://wiki.bennugd.org/index.php?title=Global_signals
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

BoMbErLiNk

  • Sr. Member
  • ****
  • Mensajes: 394
  • Karma: 37
Antes de ponerlo en la wiki, al compilar he visto varios problemas  :

- pid ya esta declarado
function restore_state( int pid )
private
    pid;

- S_TREE y S_FORCE no me los reconoce, que debería ir aquí ?

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Anda, es verdad, eso me pasa por meter código sin probar :(.
A ve Spinter, en mod_proc tenemos definidas estas constantes
Código: [Seleccionar]

INT S_KILL = 0
INT S_WAKEUP = 1
INT S_SLEEP = 2
INT S_FREEZE = 3
INT S_KILL_TREE = 100
INT S_WAKEUP_TREE = 101
INT S_SLEEP_TREE = 102
INT S_FREEZE_TREE = 103
INT S_KILL_FORCE = 50
INT S_WAKEUP_FORCE = 51
INT S_SLEEP_FORCE = 52
INT S_FREEZE_FORCE = 53
INT S_KILL_TREE_FORCE = 150
INT S_WAKEUP_TREE_FORCE = 151
INT S_SLEEP_TREE_FORCE = 152
INT S_FREEZE_TREE_FORCE = 153
INT S_DFL = 0
INT S_IGN = 1
INT ALL_PROCESS = 0
¿Hay que insertar dos nuevas, o hay que cambiar por alguna de estas?
Gracias de antemano, en cuanto lo sepa lo cambio en la wiki.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12887
  • Karma: 377
es cierto

#define S_FORCE             50
#define S_TREE              100
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12887
  • Karma: 377
copialo de nuevo y probalo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
confío en tí :D.
Subido de nuevo al wiki.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12887
  • Karma: 377
probalo please...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12887
  • Karma: 377
Re: [CODE] funcion para enviar signals globales y luego recuperar su estado original
« Respuesta #8 en: Septiembre 03, 2010, 11:24:31 pm »
fixeado!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

  • Hero Member
  • *****
  • Mensajes: 2863
  • Karma: 34
  • Superviviente marciano
    • futublock
Re: [CODE] funcion para enviar signals globales y luego recuperar su estado original
« Respuesta #9 en: Septiembre 26, 2011, 09:35:37 pm »
vamos a ver que me aclare, ciertas discusiones que me han mandado por aqui y el tema es viejaco asi que resumiendo:

¿Con este codigo le podemos mandar señales a procesos que ya esten congelados??

KeoH

  • Hero Member
  • *****
  • Mensajes: 1170
  • Karma: 17
Re: [CODE] funcion para enviar signals globales y luego recuperar su estado original
« Respuesta #10 en: Septiembre 26, 2011, 09:42:19 pm »
vamos a ver que me aclare, ciertas discusiones que me han mandado por aqui y el tema es viejaco asi que resumiendo:

¿Con este codigo le podemos mandar señales a procesos que ya esten congelados??

si se pueden mandar señales a los congelados ... son la unica manera de descongelarlos xD

Futu-block

  • Hero Member
  • *****
  • Mensajes: 2863
  • Karma: 34
  • Superviviente marciano
    • futublock
Re: [CODE] funcion para enviar signals globales y luego recuperar su estado original
« Respuesta #11 en: Septiembre 26, 2011, 10:04:30 pm »
vale, entonces me he explicado mal, lo que quiero es cambiar el valor de una variable dentro de un proceso congelado...

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12887
  • Karma: 377
Re: [CODE] funcion para enviar signals globales y luego recuperar su estado original
« Respuesta #12 en: Septiembre 26, 2011, 10:12:42 pm »
a ver... las signals van a todo proceso, no importa el estado que este tenga... un signal le cambia el estado a un proceso... y no solo afecta a los que estan corriendo...

para cambiar las variables de un proceso, tenes que hacer idproceso.variable... eso creo que ya lo sabes.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

  • Hero Member
  • *****
  • Mensajes: 2863
  • Karma: 34
  • Superviviente marciano
    • futublock
Re: [CODE] funcion para enviar signals globales y luego recuperar su estado original
« Respuesta #13 en: Septiembre 27, 2011, 07:22:46 am »
ups
me ahorraré comentarios hasta que no tenga claro que es lo que me falla, que ya estoy liando la pita ;D

Outlaw

  • Sr. Member
  • ****
  • Mensajes: 464
  • Karma: 9
Re: [CODE] funcion para enviar signals globales y luego recuperar su estado original
« Respuesta #14 en: Septiembre 28, 2011, 03:04:18 am »
Hola Splinter! Revivo este post debido a la búsqueda que realicé por todo el foro en busca de como pausar un juego, sin hacerlo directamente del main (antes existía al parecer la función signal_all para este fin), es decir, desde un proceso "menu pausa" que cito a continuación:


Código: [Seleccionar]
Process Menu_salida()
Private
int id_txt[1];
int id_cursor;
int n;
End
Begin
save_state_and_signal(0,s_sleep);      // Freezes all processes.
id_txt[0]=Write(fnt_titulos,300,100,4,"Volver");
id_txt[1]=Write(fnt_titulos,300,150,4,"Salir");
id_cursor=Cursor(300,100,fpg_hud,18,100,150,50);
Loop
If (id_cursor.y == 100 and key(_enter))
While (key(_enter)) Frame; End
From n=0 to 1;
Delete_text(id_txt[n]);
End
restore_state(0);  // restore all processes
Break;
End
If (id_cursor.y == 150 and key(_enter))
While (key(_enter)) Frame; End
Exit();
End
Frame;
End
End


Lo que sucede acá es que. habiendo usado las funciones que creaste, la cual la primera anda bien, al restaurar el estado inicial de todos los procesos, sucede que pareciera que hace un s_kill, porque me desaparecen todos menos el main, quedando a la vista solamente el fondo del mapa con los puntajes solos, sin el personaje, ni el hud, nada. ¿Alguien encontró este tipo de error? ¿Que estaré haciendo mal?
« última modificación: Septiembre 28, 2011, 03:27:32 am por SplinterGU »
"Life is cheap when the bounty is high"