Escaneador de procesos

Started by Danielo515, September 20, 2008, 12:59:19 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

He estado pensando que sería util un escaneador de procesos, alguien a quien le pudieras consultar ciertas cosas sobre los procesos, una especie de dios que lo sepa todo de todos y te conteste a lo que necesites. Ejemplo:
-Oh, dios, hay algún  proceso con las coordenadas tal tal?
-Sí, lo hay, es del tipo, tal tal, ¿quieres que te de su id?
- Pues si eres tan amable....
Actuamos sobre ese proceso.***

Esto me parece util cuando no queremos tener que tirar de collision o de un array o tabla que almacene ids e informaciones (que además están limitadas  a lo que previamente declaramos).
Ejemplo

ID_resultante=escanea_procesos(x=100,y=200,vida>=20);
if(ID_resultante, tipo monstruo) signal(id_resultante,s_kill);

Esto también resultaría util cuando queremos conocer cual es el proceso más antiguo de un tipo en concreto. Por ejemplo, cada proceso almacena su momento de creación en una variable local, y nosotros le preguntamos a ese dios, quien la tiene más alta, y nos da su id para hacer con el lo que queramos.
También podría ser
id=escanea_procesos(type siervos,edad>=20);
signal(s_kill,id);
Y mataríamos todos los procesos de ese tipo creados durante los 20 primeros segundos, y cosas así.
Aplicaciones yo creo que tiene mil. Solo hace falta que alguien con más experiencia y dicción coja la idea, la entienda, la vea útil y se la  explique a los demás.  :D

Packo_z007

#1
Lo que podes hacer es:

while(proceso = Get_id(0))
if(condicion)//por ejemplo proceso.x== 5
break;
end
end

y aca "proceso" tendria el valor del id que buscas
[STRING] *PANIC Too many strings, allocating more space

TYCO

Para la primera (detecta todos los procesos):
If (id=get_id(0) AND id.x == 100 AND id.y == 100 AND id.vida => 20)
signal(s_kill,id);
End

Para la segunda (detecta solo un tipo de proceso):
// "edad" es una variable local o publica para todos los procesos o para algunos concretos.
If (id=get_id(type siervos) AND edad => 20)
signal(s_kill,id);
End
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

Danielo515

#3
Que conste que lo pongo aquí porque tiene que ver con el topic.
Intenté hacer lo que tu me propusiste tyco, y el resultado es que hace lo que le da la gana.
Dudaria de las condiciones que he puesto si no fuera porque tengo otro proceso automático, al que no se le escapa uno, y sin embargo en este se cumple la condición cuando le da la gana. Imagino que tiene algo que ver con la función get_id ¿pilla siempre al mismo proceso mientras esté vivo? lo digo porque a mi me suelen coincidir varios procesoss del mismo tipo en pantalla
Como ves, la primera condición debería darse siempre que un coche superara el límite de velocidad, pero el resultado es que muchos a los que mis limitados reflejos hubieran pillado, a el se le escapan, y no alcanzo a entender el porqué.
[code language="bennu"]global
int posibilidad_acertar[4]=0,0,100,0,50;
int posibilidad_fallar[4]=0,0,0,0,50;
end                     

process IA_miniradar(int jugador)
private
vehiculo_miniradar coche;
int disparar;
begin                   
write(0,miniradar_radar_x[jugador],miniradar_radar_y[jugador],4,"IA");
repeat
while(coche=get_id(type vehiculo_miniradar))
   
   if((coche.velocidad_publica*0.2)>=miniradar_vel_permitida && coche.region==jugador);
      
      if(miniradar_flashing[jugador]==0 && coche.fotos>0 && coche.y<miniradar_limite_inferior[jugador]-100)
         foto_miniradar(jugador);
         
      end
   elif((coche.velocidad_publica*0.2)<=miniradar_vel_permitida && coche.region==jugador);
      disparar=rand(0,100);
      if(disparar<=posibilidad_fallar[jugador] && miniradar_flashing[jugador]==0  && coche.fotos>0 && coche.y<miniradar_limite_inferior[jugador]-100)
         foto_miniradar(jugador);
         
      end
   end 
end

frame;
until(ganador<>0)
end[/code]

Packo_z007

Quote from: TYCO on September 20, 2008, 02:39:11 PM
Para la primera (detecta todos los procesos):
If (id=get_id(0) AND id.x == 100 AND id.y == 100 AND id.vida => 20)
signal(s_kill,id);
End

Para la segunda (detecta solo un tipo de proceso):
// "edad" es una variable local o publica para todos los procesos o para algunos concretos.
If (id=get_id(type siervos) AND edad => 20)
signal(s_kill,id);
End


El problema de este codigo es que get_id(0) devuelve el id del primer proceso que encuentra (solo uno). Sucesivas llamadas a la funcion devuelven los ids de los siguientes procesos que encuentre (hasta que ya no quede ninguno y devolverá 0). Por eso es necesario el while (para que revise todos los procesos).
[STRING] *PANIC Too many strings, allocating more space

Danielo515

O sea, que en cualquiera de los casos (get_id(0) o get_id(cualquier proceso), hace falta que esté dentro de un while hasta que la condición de evaluación sea cierta, ¿es así como lo he de hacer? cuando vuelva lo pruebo a ver que tal.

Muchas gracias.

TYCO

Bueno aunque no lo indique (lo di por supuesto), Packo_z007 tiene razon, puse un ejemplo incompleto.

Quizas con algo como lo siguiente valdria:

Para la primera (detecta todos los procesos):
While (id=get_id(0))
If (id.x == 100 AND id.y == 100 AND id.vida => 20)
signal(s_kill,id);
End
End

Para la segunda mas de lo mismo.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

SplinterGU

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

Danielo515

Ja ja ja, a la hoguera a la hogera!

Entonces chicos, según veis mi ejemplo ¿no valdría el repeat? tendría que ser un while? es que supongo que en cada iteración encontrará un proceso distinto no?

Danielo515

He editado el primer código para que esté tal y como lo tengo ahora.
Hay muchos coches que cumplen está línea de condiciones
[code language="bennu"]if((coche.velocidad_publica*0.2)>=miniradar_vel_permitida && coche.region==jugador);

if(miniradar_flashing[jugador]==0 && coche.fotos>0 && coche.y<miniradar_limite_inferior[jugador]-100)
foto_miniradar(jugador);

end[/code]

Lo se porque son condiciones que usan otros procesos para hacer cosas y se cumplen, además que tengo monitorizadas las velocidades. El caso es que esta otra línea, que debería cumplirse menos a menudo:
[code language="bennu"]elif((coche.velocidad_publica*0.2)<=miniradar_vel_permitida && coche.region==jugador);
disparar=rand(0,100);
if(disparar<=posibilidad_fallar[jugador] && miniradar_flashing[jugador]==0  && coche.fotos>0 && coche.y<miniradar_limite_inferior[jugador]-100)
foto_miniradar(jugador);

end
end  [/code]

Parece que le hace más gracia, y a pesar de que tiene cierto grado de aleatoriedad, acierta con ello muchas más veces que con lo otro, es una cosa un tanto rara.

Danielo515

voy a abrir un post nuevo en mesa de ayuda sobre este tema, ya que hace tiempo que dejó de ser una sujerencia y se convirtió en un problema personal.

Allí os veo.