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): |
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 |
|
|
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() |