[CODE] funcion para enviar signals globales y luego recuperar su estado original

Started by SplinterGU, February 02, 2010, 02:09:08 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

signal_misc.prg


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

DCelso

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

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

Anda, es verdad, eso me pasa por meter código sin probar :(.
A ve Spinter, en mod_proc tenemos definidas estas constantes


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

es cierto

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

SplinterGU

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

DCelso

Monstruos Diabólicos

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

SplinterGU

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

SplinterGU

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

Futu-block

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

Quote from: Futublock on September 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??

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

Futu-block

vale, entonces me he explicado mal, lo que quiero es cambiar el valor de una variable dentro de un proceso congelado...

SplinterGU

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

ups
me ahorraré comentarios hasta que no tenga claro que es lo que me falla, que ya estoy liando la pita ;D

Outlaw

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:



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?
"Life is cheap when the bounty is high"