/[ambar]/ambar/cronomine.py
ViewVC logotype

Diff of /ambar/cronomine.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2.3 by amoyav, Sat Dec 7 23:09:35 2002 UTC revision 2.4 by amoyav, Sat Jul 5 23:25:52 2003 UTC
# Line 48  class CronoMine(object): Line 48  class CronoMine(object):
48          vencimiento_func -- la función que será llamada al vencimiento. La función          vencimiento_func -- la función que será llamada al vencimiento. La función
49                              recibirá un parámetro: este crono.                              recibirá un parámetro: este crono.
50          """          """
   
         control.lista_cronos.append(self)  
51                    
52          self.control = control          self.__control = control
53          self.vencimiento_func = vencimiento_func          self.__vencimiento_func = vencimiento_func
54            
55          # No guardamos el intervalo de tiempos, sino la fecha en la que la          # No guardamos el intervalo de tiempos, sino la fecha en la que la
56          # cuenta termina.          # cuenta termina.
57          self.fecha_vencimiento = FechaHoraMine_ahora() + vencimiento          self.__fecha_vencimiento = FechaHoraMine_ahora() + vencimiento
58            
59            self.__control._CronoMineControl__lista_cronos.append(self)
60    
61    
62        def tiempo_restante(self):
63            """Devuelve un FechaHoraMineRel con el tiempo que le queda hasta el vencimiento.
64            
65            Requiere:
66                Cronometro no está en pausa.
67            """
68            return self.__fecha_vencimiento - FechaHoraMine_ahora()
69                      
70                
71        def parar(self):
72            """Detiene la cuenta y destruye el crono."""
73            self.__control._CronoMineControl__lista_cronos.remove(self)
74    
75    
76        def pausar(self):
77            """Detiene temporalmente el crono, con posibilidad de reanudarlo después.
78    
79            Es necesario guardarlo en algún puntero mientras está detenido.
80    
81      def avanzar(self, fecha_ahora):          Requiere:
82                Cronometro no está en pausa.
83            """
84            self.__control._CronoMineControl__lista_cronos.remove(self)
85            self.__tiempo_restante = self.__fecha_vencimiento - FechaHoraMine_ahora()
86            del self.__fecha_vencimiento
87    
88    
89        def reanudar(self):
90            """Prosigue la cuenta de tiempo, con el tiempo restante cuando se pausó.
91    
92            Requiere:
93                Cronometro está en pausa.
94            """
95            self.__fecha_vencimiento = FechaHoraMine_ahora() + self.__tiempo_restante
96            del self.__tiempo_restante
97            self.__control._CronoMineControl__lista_cronos.append(self)
98    
99    
100        def __avanzar(self, fecha_ahora):
101          """Para ser llamada sólo desde CronoMineControl.          """Para ser llamada sólo desde CronoMineControl.
102    
103          Compara la fecha actual con la de vencimiento, y si es igual o superior,          Compara la fecha actual con la de vencimiento, y si es igual o superior,
104          llama a la función de vencimiento y destruye el crono.          llama a la función de vencimiento y destruye el crono.
105          """          """
106          if fecha_ahora >= self.fecha_vencimiento:          if fecha_ahora >= self.__fecha_vencimiento:
107              self.vencimiento_func(self)              self.__vencimiento_func(self)
108              self.control.lista_cronos.remove(self)              self.__control._CronoMineControl__lista_cronos.remove(self)
109                
110                
111      def parar(self):      def __getstate__(self):
112          """Detiene la cuenta y destruye el crono."""          """Método llamado para preguntar qué hay que salvar en un pickle."""
113          self.control.lista_cronos.remove(self)          atributos = self.__dict__.copy()
114    
115            # La funcion de callback no se puede salvar en un pickle, asi que
116            # guardamos información suficiente para reconstruirla después.
117            del atributos["_CronoMine__vencimiento_func"]
118            if getattr(self.__vencimiento_func, "im_self", None) != None:
119                # Es un método de clase
120                atributos["_CronoMine__instancia_cb"] = self.__vencimiento_func.im_self
121                fname = self.__vencimiento_func.im_func.func_name
122                if fname[0:2] == "__":
123                    # Los metodos privados hay que renombrarlos a _Clase__nombre_metodo
124                    fname = "_" + self.__vencimiento_func.im_self.__class__.__name__ + fname
125                atributos["_CronoMine__funcion_cb"] = fname
126            else:
127                # Es una función normal
128                atributos["_CronoMine__instancia_cb"] = None
129                atributos["_CronoMine__funcion_cb"] = self.__vencimiento_func.func_name
130            del atributos["_CronoMine__control"] # PIFIA GORDA: ¿como restauramos esto ahora?
131            return atributos
132    
133    
134        def __setstate__(self, atributos):
135            """Método llamado para restaurar los atributos provinientes de un pickle."""
136            if atributos["_CronoMine__instancia_cb"] != None:
137                # Es un método de clase
138                instancia_cb = atributos["_CronoMine__instancia_cb"]
139                funcion_cb = atributos["_CronoMine__funcion_cb"]
140                func_cb = getattr(instancia_cb, funcion_cb)
141            else:
142                # %%Komo kohone recupero una funcion normal global????
143                func_cb = atributos["_CronoMine__funcion_cb"]
144            atributos["_CronoMine__vencimiento_func"] = func_cb
145            del atributos["_CronoMine__instancia_cb"]
146            del atributos["_CronoMine__funcion_cb"]
147            self.__dict__ = atributos
148            from mundo import Mundo
149            self.__control = Mundo.cronoMine_control # CHAPUZA: funciona pero no es nada legal...
150            if getattr(self, "_CronoMine__fecha_vencimiento", None) != None:
151                self.__control._CronoMineControl__lista_cronos.append(self)
152    
153    
154  class CronoMineControl(object):  class CronoMineControl(object):
155      """Controlador que contiene y avanza automáticamente a los cronómetros."""      """Controlador que contiene y avanza automáticamente a los cronómetros."""
156            
157      def __init__(self):      def __init__(self):
158          self.lista_cronos = []          self.__lista_cronos = []
159    
160    
161      def run(self):      def run(self):
# Line 89  class CronoMineControl(object): Line 165  class CronoMineControl(object):
165          Esta función es llamada desde dentro de un bucle en el programa principal.          Esta función es llamada desde dentro de un bucle en el programa principal.
166          """          """
167          fecha_ahora = FechaHoraMine_ahora()          fecha_ahora = FechaHoraMine_ahora()
168          for crono in self.lista_cronos:          for crono in self.__lista_cronos:
169              crono.avanzar(fecha_ahora)              crono._CronoMine__avanzar(fecha_ahora)
170                    
171                    
172    
# Line 102  if (__name__ == '__main__'): Line 178  if (__name__ == '__main__'):
178    
179      def venc_f(crono):      def venc_f(crono):
180          print "vencido"          print "vencido"
181          nuevo_venc = FechaHoraMineRel(segundos = random() * 5 + 0.5)          #nuevo_venc = FechaHoraMineRel(segundos = random() * 5 + 1)
182          print "creado crono a " + "%0.2f" % nuevo_venc.segundos() + " segundos"          #print "creado crono a " + "%0.2f" % nuevo_venc.segundos() + " segundos"
183            nuevo_venc = FechaHoraMineRel(horas = (random() * 5 + 1) / 20)
184          t = CronoMine(control, nuevo_venc, venc_f)          t = CronoMine(control, nuevo_venc, venc_f)
185            print "creado crono con duracion " + str(t.tiempo_restante())
186            
187      control = CronoMineControl()      control = CronoMineControl()
188      venc = FechaHoraMineRel(segundos = random() * 5 + 0.5)      #venc = FechaHoraMineRel(segundos = random() * 5 + 1)
189      print "creado crono a " + "%0.2f" % venc.segundos() + " segundos"      #print "creado crono a " + "%0.2f" % venc.segundos() + " segundos"
190        venc = FechaHoraMineRel(horas = (random() * 5 + 1) / 20)
191      t = CronoMine(control, venc, venc_f)      t = CronoMine(control, venc, venc_f)
192        print "creado crono con duracion " + str(t.tiempo_restante())
193            
194      while 1:      while 1:
195          control.run()          control.run()

Legend:
Removed from v.2.3  
changed lines
  Added in v.2.4

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26