Orden de muerte al matar con S_KILL_TREE

Started by Windgate, September 30, 2009, 05:49:35 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

¿Pero signal no requiere como primer parámetro el ID de un proceso? yo no he leido en ninguna parte que se pueda especificar un TIPO DE PROCESO, que son cosas muy distintas.
Yo, cuando quiero matar todos los procesos de un tipo uso un loop así:

temp=get_id(type mi_proceso);
while (temp)
signal(temp,s_kill);
temp=get_id(type mi_proceso);
end
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)

FreeYourMind

Eso es perder tiempo, si ya te han dicho que lo otro es lo que hace.
Yo lo utilizo para matarlos todos del mismo tipo y funciona de perlas.

SplinterGU

claro, estabas codificando demas... un simple signal( type mi_proceso, s_kill ) es suficiente

lo mismo si haces un signal(0, s_kill) mata todos los procesos.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Quote from: SplinterGU on July 25, 2010, 05:13:56 AM
claro, estabas codificando demas... un simple signal( type mi_proceso, s_kill ) es suficiente

lo mismo si haces un signal(0, s_kill) mata todos los procesos.

let_me_alone();

DjSonyk

Drumpi: temp=get_id(type mi_proceso)  y signal(type mi_proceso,s_kill) son anologas,salvando la diferencia que con la primera se coge el identificardor de los procesos para por ejemplo poder manejarles , temp.x=10, consultarles ,dame_x=temp.x, matarles signal(temp,s_kill),ect  y la segunda coge los identificadores del proceso especificado para mandarles directamente la señal...
Leer por lo que veo que lees poco, (es de coña ;P),porque viene en el manual de DIV y DIV2,no se si en alguno otro mas manual mas vendra ,seguro que si,como en la wikipedia...
La incoveniente,si esque lo es, de signal(type mi_proceso,s_kill) es que con una sentencia destruyes todos los procesos del tipo especificado,con lo que si solo quisieras destruir alguno de ellos esta sentencia no te valdria.

SplinterGU

Quote from: FreeYourMind on July 25, 2010, 12:38:05 PM
Quote from: SplinterGU on July 25, 2010, 05:13:56 AM
claro, estabas codificando demas... un simple signal( type mi_proceso, s_kill ) es suficiente

lo mismo si haces un signal(0, s_kill) mata todos los procesos.

let_me_alone();

si y no, no es exactamente lo mismo, let_me_alone fuerza la muerte de todos los procesos sin importarle nada, en cambio, signal( ALL_PROCESSS, ...), o sea, signal( 0, ... ), mata todos los procesos pero tiene en cuenta los signal_actions.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Quote from: DjSonyk on July 25, 2010, 01:35:35 PM
Drumpi: temp=get_id(type mi_proceso)  y signal(type mi_proceso,s_kill) son anologas,salvando la diferencia que con la primera se coge el identificardor de los procesos para por ejemplo poder manejarles , temp.x=10, consultarles ,dame_x=temp.x, matarles signal(temp,s_kill),ect  y la segunda coge los identificadores del proceso especificado para mandarles directamente la señal...
Leer por lo que veo que lees poco, (es de coña ;P),porque viene en el manual de DIV y DIV2,no se si en alguno otro mas manual mas vendra ,seguro que si,como en la wikipedia...
La incoveniente,si esque lo es, de signal(type mi_proceso,s_kill) es que con una sentencia destruyes todos los procesos del tipo especificado,con lo que si solo quisieras destruir alguno de ellos esta sentencia no te valdria.

pero el caso es que se quiere destruir procesos type, no entiendo para que drumpi menciona de matar uno individual.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Por desgracia, carezco del manual de DIV (y el DIV no me funciona en el SO que suelo usar), el 80% de las veces que busco en la wiki (tanto la de aqui como la de Fenixworld, porque la de divsite y la de jlceb están caidas) me dice que no existe.
La ayuda que uso es la que tengo a mano: un archivo .hlp de Fenix 083b y que dice:

QuoteINT SIGNAL ( INT proceso, INT señal )
Esta función cambia el estado de un proceso o, si recibe como parámetro una de las constantes acabadas en _TREE, de un proceso y de todos sus hijos y descendientes.
Existen cuatro posibles estados para un proceso: WAKEUP: el estado por defecto. El proceso se ejecuta normalmente cada frame, y si su variable GRAPH contiene algún valor, se dibuja un gráfico en pantalla en las coordenadas especificadas por sus variables locales x e y. FREEZE: el proceso está detenido, de manera que su código no se ejecuta cada frame, Sin embargo, su gráfico sí que se dibuja normalmente. SLEEP: el proceso está durmiente. Su código no se ejecuta, ni tampoco se dibuja su gráfico en pantalla. KILL: el proceso está marcado para morir. Si este frame todavía no se ha ejecutado, no se ejecutará ni se mostrará en pantalla. Antes de comenzar el siguiente frame, la memoria ocupada por el proceso será liberada y el proceso desaparecerá de la lista interna.
La función SIGNAL puede cambiar en cualquier momento el estado de un proceso o de sus hijos. Los cambios no afectan al proceso actual hasta que su ejecución termine por llegar a la sentencia FRAME. De la misma manera, el proceso padre (y el resto de antecesores) no se verán afectados por los cambios hasta la sentencia FRAME.

Parámetros:
   INT proceso: Identificador de un proceso
   INT señal: Tipo de señal a enviar al proceso. Puede ser una de las siguientes constantes predefinidas: S_KILL S_WAKEUP S_SLEEP S_FREEZE S_KILL_TREE S_WAKEUP_TREE S_SLEEP_TREE S_FREEZE_TREE

Ejemplo:
PROGRAM mi_juego;
PRIVATE id2;
BEGIN
   id2=mi_proceso();
   // ...
   signal(id2, s_kill);
END

PROCESS mi_proceso()
BEGIN
   // ...
   LOOP
       FRAME;
   END
END


VER TAMBIÉN:
GET_ID

Pues nada, ya lo se para otra vez, y me ahorro bucles.
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)

SplinterGU

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

DjSonyk

La función SIGNAL puede cambiar en cualquier momento el estado de un proceso o de sus hijos. Los cambios no afectan al proceso actual hasta que su ejecución termine por llegar a la sentencia FRAME. De la misma manera, el proceso padre (y el resto de antecesores) no se verán afectados por los cambios hasta la sentencia FRAME.

Cambios en BennuGD con respecto a tu cita Drumpi:
En BennuGd la sentencia SIGNAL se ejecuta al instante no al llegar al siguiente FRAME,acausa de eso,es lo que mas me a tocado corregir al hacer las portaciones de mis "juegos"de DIV a Bennu,para que nadie se confunda con la cita :P.

FreeYourMind

Ya que estamos tengo un error con freeze, no me congela el proceso que quiero, este proceso hace una animacion y coloca el gráfico en distintas posiciones durante un tiempo, pues bien, si llamo el proceso espera(), quiero que este congele el proceso anim() durante otro cierto tiempo, pero no esta funcionando, pongo el ejemplo:


PROCESS espera()
PRIVATE
t = 0;

BEGIN

  LOOP
 
    t++;

    SWITCH (t)
  CASE 0:
     
             signal(type anima, s_freeze); // No funciona, la animación random sigue ocurriendo!

          CASE 18:
     
     signal(type anima, s_wakeup);
      END
END
  FRAME;
  END
END


PROCESS anima()
PRIVATE
Vel;

BEGIN

  graph = 350;
  x = 91;
  y = 182;
  z = -1;

LOOP

FROM Vel = 1 TO 100;

  // Random
  IF (1 == rand(1, 3))
      graph = 350;
      x = 91;
      y = 182;
 
  ELSE
     IF (1 == rand(1, 3))
         graph = 351;
         x = 132;
         y = 182;

     ELSE
         graph = 353;
         x = 132;
         y = 194;

     END
END

FRAME(Vel);
END
 
FRAME;
END

END

DjSonyk

¿Has probado a subir el tiempo de t a un numero mucho mas alto? 18 me parece poco y mas si tienes los FPS bastantes altos ,date cuenta que si por ejemplo lo tienes a 60 FPS , el tiempo que va a estar congelado es mas o menos , 60/18*procesos activos...es menos de 1 segundo lo que estara congelado...

FreeYourMind

Lo tengo a 24fps, el problema es que sólo lo necesito congelado ese pequeño instante, porque es en el cual hago otras animaciones que no he puesto por simplificar, y esto tiene que congelarse sólo este instante si o si, ya que es mi objetivo.

DjSonyk

Deverias subir el case a por ejemplo 5000; para ver si realmente no te funciona y mirartelo mas despacio,te lo digo porque a simple vista creo que es por eso,y si ves que no se te congela mirartelo tranquilamente,y si te funciona y reduciendolo hasta que quedes sastisfecho ^^

FreeYourMind

Es lo que voy hacer. Pero date cuenta que en ese pequeño tiempo hago 3 animaciones que son crear/destruir 3 veces un proceso con una imagen, así que si tengo tiempo para eso (el cual se tiene tiempo de visualizarse) tambien deberia tener tiempo para que este proceso se congele.
No puedo cambiar el tiempo en la version final, porque estoy imitando el juego original que hace las animaciones exactamente en ese periodo de tiempo. Tendria que hacerlo de otra forma, porque aumentar el tiempo seria lo mismo que quedar en la mierda y no poder imitar el original, que es justo mi objetivo  ;)