Pausar una función dentro de un proceso

Started by BlySntK, November 16, 2011, 06:34:02 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

BlySntK

Bien, tal como expongo en el asunto, me interesaría averiguar algo posiblemente fácil de hacer pero que se me escapa un poco de las manos, por ahora...

Sé cómo pausar procesos en sí, no es para nada difícil, lo que se me planteó ahora (al hacer para mi "autoevaluación" un ejercicio con todo lo aprendido hasta hoy) es el cómo pausar una función propia, ejecutándose junto con el proceso que la incluye. Quizás no se pueda; tal vez porque al congelar la función (de poderse hacer eso) también se congele el proceso y, por ello todo el programa. Pensandolo y, sabiendo que un proceso frena al ejecutar una función tras otra hasta poder visualizar sus resultados llegado al frame, se me ocurrió meter dentro de la función un signal con el identificador ID (el que recoge el número del proceso actual (se recoge a sí mismo)), y de hecho me funció como creo haber comentado antes. El problema reside en que, si vuelvo a hacer un signal para "despertar" a la función, parece como si se hubiera colgado el programa y no me hace nada más. Lo cual es curioso siendo que, después del proceso que contiene esta función, hay otro más, con lo que no consigo entender lo que sucede.

¿Una ayudita para un niño lelo? xDD
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)

SplinterGU

mmmm... ahora veo un poco mas de lo que dices...

un proceso que llame a una funcion se congela hasta que la funcion retorne... las funciones son procesos separados, asi que tienen su propio ID, si tu mandas a un signal al id de la funcion, esta se congela... pero si tu no tienes otro proceso externo para despertarla, esta nunca volvera a funcionar nuevamente.


import "mod_say";
import "mod_proc";

process g()
private
pid;
i;
begin
for(i=0;i<10;i++) say( "counter="+i ); frame; end

if ( pid = get_id( type f ) )
    signal(pid, s_wakeup);
end
end

function f()
begin
say( "f("+id+") sleeping");
signal(id,s_sleep);
frame;
say( "f("+id+") wakeup");
end

begin
g();
say( "main("+id+") call func f()");
f();


end


proba comentando el signal s_sleep y viendo que pasa...

disculpa que no te lo respondi por PM, pero bueno, me hice un tiempito.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

gecko

eeee la verdad no entendi mucho lo que queres hacer :P

pero si lo que queres es dormir a todos menos a uno (o al padre y algunos de sus hijos, o algo asi) lo que podes usar es signal_action() que te permite cambiar la forma en que el proceso reacicona a los signals (ignorarlos o ejecutarlos)

http://wiki.bennugd.org/index.php?title=Signal_action

(disculpa si no es lo que buscas, pero es lo que masomenos entendi)
Torres Baldi Studio
http://torresbaldi.com

BlySntK

Gracias por responder a ambos ^_^

Realmente no contaba con que un proceso externo debía ser el que "despertara" a una funcion de otro proceso... No caí en ello (tampoco lo sabía), sí sabía que cada proceso tiene un id diferente y tal... pero no que cada función también tiene... aunque ahora que lo pienso... si que lo pone en el manual.... vaya, que error mio!!! Aún así debo estudiar el código que me pasaste splinter... parece interesante y un tanto lioso al principio, poco a poco voy sabiendo lo que hace :) Muchas gracias, te ganaste un karmoiditis por contestarme, jejeje. (Y gecko igual :P)

Voy a probarlo y os comento... si puedo xD
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)

BlySntK


import "mod_proc"
import "mod_key"
import "mod_text"

local // Supongo que dá lo mismo ponerlo local que global... lo he intentando y me hace lo mismo
int id1,id2;
end

process main()

begin
id1=process1();
frame;
end

process process1()

private
int i;
end
begin
for(i=0;i<100;i++)
delete_text(0);
f();
write(0,10,20,3,"counter="+i);
frame;
end
id2=process2();
frame;
end

process process2()
private
int i;
end
begin
for(i=0;i<100;i++)
delete_text(0);
f();
write(0,10,30,3,"counter="+i);
frame;
end
process3();
frame;
end

process process3()
private
int i;
end
begin

for(i=0;i<100;i++)
delete_text(0);
f();
write(0,10,40,3,"counter="+i);
frame;
end
frame;
end

function f()
private
int pausa=0;
end

begin
if(key(_p) && pausa==0)
signal(id1,s_freeze);
pausa=1;
elseif(key(_p) && pausa==1)
signal(id1,s_wakeup);
pausa=0;
end
end

Aquí está parte del código con el que estoy ensayando la pausa... Me sigue haciendo lo mismo, me pausa por ejemplo el proceso 1 pero no me devuelve al proceso en activo... (no estan los demas procesos puestos en los ifs de la función, si no me funciona uno... no me funcionarán los demás, gracias (me voy un rato que ando saturado -_-)
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)

SplinterGU

local es local a cada proceso/funcion... cuando haces un signal(id1...) siendo id1 local, lo que haces es hacer un signal al contenido id1 de tu local en la funcion, en tu ejemplo es 0.

igual me parece que lo que armaste esta un poco rebuscado y no va a funcionar, porque va a rebotar entre los procesos la pulsacion y el estado pausa.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

BlySntK

Entonces, con ese planteamiento... (con el codigo que puse aquí) cual sería la forma optima de hacer una pausa, por más que lo pienso... no doy con el truco :( Seguiré intentandolo aún así...
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)

SplinterGU

no entiendo que queres hacer exactamente.

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

BlySntK

Lo que quería venir consiguiendo, aunque en realidad lo puse en el hilo como una forma de programar opcional y, por curiosidad concretamente, era que el mismo programa tuviese una manera de pausarlo pulsando una tecla. Realmente ya conseguí anteriormente (en una de las prácticas que vienen en el tutorial de Bennu sale y perfectamente se puede hacer (y sé, obvio)) pausar un par de programillas de practica; que un proceso pausara el programa mediante la congelación de otro proceso por medio de variables globales (sé que tambien se pueden hacer con variables locales). La curiosidad fue, a la hora de aprender a hacer funciones, era simplemente pretender hacer esa misma pausa que se consigue desde un proceso, hacerlo desde dentro de la función invicada por el proceso que la contuviera. Pero sé que inconvenientes hay algunos y, el más notable, es el que dices tú, Splinter, que al tener la función su propia ID ajena a cualquier proceso, por muy dentro de uno que esté, la ID obtenida sería la de la misma función, esté en el proceso que esté... a menos que la función (lo venía pensando ahora) consiguiera la id del proceso que la contiene con la función get_id, no sé si eso se podrá hacer... Aún tengo que aprender y probar muchas otras cosas.
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)

gecko

Vuelvo a sugerir algo de acuerdo a lo que entendi (que no estoy seguro si es lo que querés)

Para conseguir la ID del proceso/funcion que llamo a determinado proceso/funcion podes usar la variable FATHER, que contiene directamente esa ID.

http://wiki.bennugd.org/index.php?title=Father
Torres Baldi Studio
http://torresbaldi.com

BlySntK

De primera mano, GRACIAS a todos por vuestro apoyo y por responder tan rápidamente a mi help! Os lo agradezco, en serio. Lamentablemente, probe tambien con father xDDD te adelante gecko ;) pero no me sirvió de mucho. De hecho, desde aquí mando una enhorabuena en mayus a Splinter por el gran manual que estoy siguiendo y porque, (esto va para los novatos como yo que lo estamos siguiendo al pie de la letra) sirve Y DE MUCHO. Sólo hay que prestarle toda vuestra atención (sin perder ni un sólo momento el rumbo, os perderéis) y os aconsejo encarecidamente que hagáis tanto las prácticas tal como están, todas funcionan muy bien, además de intentar autoevaluaros pasados los capis importantes, mas o menos hasta el 4... (que es donde me encuentro, ahora voy a empezar el 5, ya que he superado-con cierta dificultad- los autotest realizados (con un poco de trampilla junto con el foro, jejje) y he conseguido descifrar mi problema, que además era muy tonto; y que paso a comentar ahora:

Bien, efectivamente, por mucho que queráis poner en pausa un proceso sobre sí mismo, no váis a poder descongelarlo, pues la ID será la misma una vez cogida, al ir al if de descongelación... (creo entenderlo así) la ID es la antigua y no la nueva, por tanto el signal no funcionará, aunque esto aún no lo acabo de entender :S Resumiendo, así no os funcionará. Pasará lo mismo con la función get_id, para una vez servirá, una siguiente es posible que no. Haciendo pruebas, básicamente he llegado a la conclusión, esto Splinter supongo que lo recordará -son sus ejemplos, jejej-, es conseguir no la identificacion del proceso exactamente, aunque sí en cierta manera, sino, detectarla... con la función exists, ésta, por medio de una función (pasandola por parametro) entonces sí la cogerá y hara lo que para mi interés, sí me ha funcionado :) Y por ello, solucionado un buen problema que hoy me ha traído de cabeza, y de qué manera... Es lo que pasa por ser novato, jo xD ÁNIMO a todos, y gracias.

P.D.: Quién lea este post-data, me gustaría que me contestara a una dudilla menos importante, pero que me gustaría solucionarla. Se trata de la función delete_text(), entre proceso y proceso, cómo haríamos si, por ejemplo, en un proceso a un for contando y en otro proceso hay otro... como en el código pasado, y me apetece que se muestren los tres? Pero los tres activos y que se vean los numerajos.. Lo digo porque, por separado, sí, es simple, pero, que cuente uno llegue, se pare y cuente el siguiente, jo, me gustaría que el que ha llegado se quede fijo y con el número intacto...
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)

SplinterGU

yo no hice ningun manual... al menos no me entere de eso.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

BlySntK

Vale, siento equivocarme... contribuíste en el lenguaje pero no hiciste el manual,¿es así? Aclaramelo anda xD
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)

SplinterGU

no hice el manual...

soy el desarrollador principal/oficial de BennuGD.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

BlySntK

Me entender :) Sorry por la confuncion :P Ya que estas, podrías decirme la última dudilla que expuse ayer? lo de cómo hacer que se pueda ver tres write's de tres procesos diferentes con delete_text() dentro de un contador; que se vean primero uno, luego que se vea el siguiente pero se quede el anterior fijo (y con el número bien visible y etc..) si eres tan amable ^_^ ejem xD
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)