Package pilas :: Module tareas
[hide private]
[frames] | no frames]

Source Code for Module pilas.tareas

  1  # -*- encoding: utf-8 -*- 
  2  # Pilas engine - A video game framework. 
  3  # 
  4  # Copyright 2010 - Hugo Ruscitti 
  5  # License: LGPLv3 (see http://www.gnu.org/licenses/lgpl.html) 
  6  # 
  7  # Website - http://www.pilas-engine.com.ar 
  8   
9 -class Tarea(object):
10
11 - def __init__(self, planificador, time_out, dt, funcion, parametros, una_vez):
12 """Representa una tarea que se puede ejecutar dentro del planificador. 13 14 :param time_out: El tiempo absoluto para ejecutar la tarea. 15 :param dt: La frecuencia de ejecución. 16 :param funcion: La funcion a invocar. 17 :param parametros: Una lista de argumentos para la funcion anterior. 18 :param una_vez: Indica si la funcion se tiene que ejecutar una sola vez. 19 """ 20 21 self.planificador = planificador 22 self.time_out = time_out 23 self.dt = dt 24 self.funcion = funcion 25 self.parametros = parametros 26 self.una_vez = una_vez
27
28 - def ejecutar(self):
29 "Ejecuta la tarea." 30 return self.funcion(*self.parametros)
31
32 - def eliminar(self):
33 "Quita la tarea del planificador para que no se vuelva a ejecutar." 34 self.planificador.eliminar_tarea(self)
35
36 - def terminar(self):
37 "Termina la tarea (alias de eliminar)." 38 self.eliminar()
39
40 -class TareaCondicional(Tarea):
41 """Representa una tarea similar a Tarea, pero que solo se ejecuta si El 42 retorno de la función a ejecutar devuelve True. 43 """ 44
45 - def ejecutar(self):
46 """Ejecuta la tarea, y se detiene si no revuelve True.""" 47 retorno = Tarea.ejecutar(self) 48 49 if not retorno: 50 self.una_vez = True
51
52 -class Tareas(object):
53 """Contenedor de tareas a ejecutar por tiempo. 54 55 El Tareas es un planificador de tareas, permite que 56 podamos ejecutar funciones y métodos luego de transcurrido 57 el tiempo que queramos. 58 59 Por ejemplo, si se quiere que el planificardor ejecute 60 una función dentro de dos segundos podemos escribir: 61 62 >>> pilas.mundo.agregar_tarea(2, hola) 63 64 o bien, especificando argumentos para esa función: 65 66 >>> pilas.mundo.agregar_tarea(4, hola, 'persona') 67 68 La función que se especifique como segundo argumento 69 tiene que retornar True o False. Si retorna True será 70 colocada nuevamente en la cola de tareas una vez que se 71 ejecute (esto es útil para crear bucles). 72 """ 73
74 - def __init__(self):
75 "Inicializa el gestor de tareas." 76 self.tareas_planificadas = [] 77 self.contador_de_tiempo = 0
78
80 """Retora la cantidad de tareas planificadas.""" 81 return len(self.tareas_planificadas)
82
83 - def actualizar(self, dt):
84 """Actualiza los contadores de tiempo y ejecuta las tareas pendientes. 85 86 :param dt: Tiempo transcurrido desde la anterior llamada. 87 """ 88 self.contador_de_tiempo += dt 89 tareas_a_eliminar = [] 90 91 for tarea in self.tareas_planificadas: 92 if self.contador_de_tiempo > tarea.time_out: 93 tarea.ejecutar() 94 95 if tarea.una_vez: 96 tareas_a_eliminar.append(tarea) 97 else: 98 w = self.contador_de_tiempo - tarea.time_out 99 parte_entera = int((w)/float(tarea.dt)) 100 resto = w - (parte_entera * tarea.dt) 101 102 for x in range(parte_entera): 103 tarea.ejecutar() 104 105 tarea.time_out += tarea.dt + (parte_entera * tarea.dt) - resto 106 107 for x in tareas_a_eliminar: 108 if x in self.tareas_planificadas: 109 self.tareas_planificadas.remove(x)
110
111 - def _agregar(self, tarea):
112 """Agrega una nueva tarea para ejecutarse luego. 113 114 :param tarea: Referencia a la tarea que se debe agregar. 115 """ 116 self.tareas_planificadas.append(tarea)
117
118 - def una_vez(self, time_out, function, params=[]):
119 """Genera una tarea que se ejecutará usan sola vez. 120 121 :param time_out: Cantidad se segundos que deben transcurrir para ejecutar la tarea. 122 :param function: Función a ejecutar para lanzar la tarea. 123 :param params: Parámetros que tiene que recibir la función a ejecutar. 124 """ 125 tarea = Tarea(self, self.contador_de_tiempo + time_out, time_out, function, params, True) 126 self._agregar(tarea) 127 return tarea
128
129 - def siempre(self, time_out, function, params=[]):
130 """Genera una tarea para ejecutar todo el tiempo, sin expiración. 131 132 :param time_out: Cantidad se segundos que deben transcurrir para ejecutar la tarea. 133 :param function: Función a ejecutar para lanzar la tarea. 134 :param params: Parámetros que tiene que recibir la función a ejecutar. 135 """ 136 tarea = Tarea(self, self.contador_de_tiempo + time_out, time_out, function, params, False) 137 self._agregar(tarea) 138 return tarea
139
140 - def condicional(self, time_out, function, params=[]):
141 """Genera una tarea que se puede ejecutar una vez o mas, pero que tiene una condición. 142 143 La tarea se ejecutará hasta que la función a ejecutar revuelva False. 144 145 :param time_out: Cantidad se segundos que deben transcurrir para ejecutar la tarea. 146 :param function: Función a ejecutar para lanzar la tarea. 147 :param params: Parámetros que tiene que recibir la función a ejecutar. 148 """ 149 tarea = TareaCondicional(self, self.contador_de_tiempo + time_out, time_out, function, params, False) 150 self._agregar(tarea) 151 return tarea
152
153 - def eliminar_tarea(self, tarea):
154 """Elimina una tarea de la lista de tareas planificadas. 155 156 :param tarea: Referencia a la tarea que se tiene que eliminar. 157 """ 158 self.tareas_planificadas.remove(tarea)
159
160 - def eliminar_todas(self):
161 """Elimina todas las tareas de la lista de planificadas.""" 162 self.tareas_planificadas = []
163