pilas.tareas

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
     79 -    def obtener_cantidad_de_tareas_planificadas(self):
     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