no termino de entender qué es lo que quieres hacer, cuando pararía de
contar el servidor? cuando llega a minutofinal? no pongas entonces el
== sino >=, ya que si se hubiera pasado, seguiria contando (quizás sea
lo que te pase)
y en vez de contar tú, porque no usas datetime.now() al inicio y al
terminar y los restas o alguna otra solución similar?
Ademas en:
if minuto_final > 0 and min == minuto_final:
print "tu tiempo terminó, gracias por tu preferencia"
exit()
if hora_final > 0 and hora == hora_final and min == minuto_final:
print "tu tiempo terminó, gracias por tu preferencia"
exit()
el segundo if sobra, porque está contenido en el primero, por lo que
siempre saltara en el primer if y nunca en el segundo.
2011/12/20 gmail <[email protected]>:
> Saludos a todos, primero que nada quisiera agradecer por permitirme entrar a
> formar parte de la lista.
>
> Quisiera ver si les será posible hecharme una mano con esto.
>
> Lo que pasa es que estoy programando dos aplicaciones, o una aplicación
> cliente/servidor que se comunica mediante sockets.
>
> El lío es que en el servidor he utilizado la clase threading.thread para
> hacer que el programa pueda atender múltiples clientes al mismo tiempo, y he
> ahí donde nace la complicación.
>
> Una de las funciones del programa es que cuando reciba la palabra libre,
> ejecute una función que se encarga de contar los segundos de uno en uno, la
> función arroja como retorno a una variable el total del tiempo que ha
> transcurrido, pero con los hilos de ejecución(se encuentra dentro del método
> run de la clase) no consigo como hacer, ya que al recibir la palabra libre,
> se ejecuta el conteo, pero no puedo hacer que se detenga y mucho menos que
> muestre cual fue el total del tiempo, se detiene la conexión al socket, pero
> sigue contando el tiempo.
>
> La función que cuenta el tiempo es esta:
> def libre(self, hora_final=0, minuto_final=0):
> #comprobamos que la variable minuto_final no tenga un valor igual o
> arriba de 60
> if minuto_final > 59:
> #si la tiene, hacemos que el nuevo valor de hora_final se cambie
> por el que salga del resultado de sumar la hora final que se tiene
> actualmente más el número que sale al dividir los minutos entre 60 para
> formar una hora, su resultado es una división entera y sobrarán números.
> hora_final = hora_final+minuto_final/60
> #aquí hacemos que lo que sobre de la división anterior se asigne
> a los minutos, para no perder más tiempo.
> minuto_final = minuto_final%60
>
> #se asignan 3 variables a 0, para ir incrementándolas comforme avance
> el tiempo.
> seg = min = hora = 0
> while True:
> #cada repetición del bucle sumará 1 a la variable seg, dando el
> efecto de avanzar en los segundos.
> seg = seg+1
> #como no se puede tener más de 60 segundos, se comprueba que seg
> no valga más que 59.
> if seg > 59:
> #cuando seg valga 60, se dividirá entre 60, lo cual dará un
> resultado de 1 y sumándolo al contador de minutos.
> min = min+seg/60
> #se stablece el contador de segundos de nuevo a 0 para
> reinicializar el proceso.
> seg = 0
> #se hace lo mismo con los minutos, pero ahora añadiendo el valor
> a horas en las siguientes 3 líneas.
> if min > 59:
> hora = hora+min/60
> min = 0
> #se muestra el resultado al usuario.
> print "%i:%i:%i" % (hora, min, seg)
> retorno =+hora, min
>
> if minuto_final == 0:
> pass
> if hora_final == 0:
> pass
> if minuto_final > 0 and min == minuto_final:
> print "tu tiempo terminó, gracias por tu preferencia"
> exit()
> if hora_final > 0 and hora == hora_final and min == minuto_final:
> print "tu tiempo terminó, gracias por tu preferencia"
> exit()
> try:
> time.sleep(1)
> except KeyboardInterrupt:
> return retorno
>
> Esta función espera a que se le pasen dos argumentos, horas máximas y
> minútos máximos a contar, si no se pasan argumentos, contará de forma
> infinita hasta que se le detenga.
>
> Y aquí está la forma de implementarla en el servidor, la función de conteo
> se encuentra en una clase llamada contador:
> from threading import Thread
>
> pc = contador.contador()
> #Clase con el hilo para atender a los clientes.
> #En el constructor recibe el socket con el cliente y los datos del
> #cliente para escribir por pantalla
> class Cliente(Thread):
> def __init__(self, socket_cliente, datos_cliente):
> Thread.__init__(self)
> self.socket = socket_cliente
> self.datos = datos_cliente
> # Bucle para atender al cliente.
> def run(self):
> # Bucle indefinido hasta que el cliente envie "adios"
> activo = True
> while activo:
> # Espera por datos
> peticion = self.socket.recv(1024)
> # Contestacion a "libre"
> if peticion == "libre":
> print str(self.datos)+ " pide tiempo libre:"
> var = pc.libre()
> self.socket.send("libre")
> ...
> if __name__ == '__main__':
> # Se prepara el servidor
> server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> server.bind(("", 8000))
> server.listen(1)
> print "Esperando clientes..."
>
> # bucle para atender clientes
> while 1:
> # Se espera a un cliente
> socket_cliente, datos_cliente = server.accept()
> # Se escribe su informacion
> print "conectado "+str(datos_cliente)
>
> # Se crea la clase con el hilo y se arranca.
> hilo = Cliente(socket_cliente, datos_cliente)
> hilo.stop()
>
>
> Me podríais ayudar? quisiera poder o detener el hilo de ejecución para sacar
> el valor de retorno o encontrar una manera de parar todo lo que se esté
> haciendo y saber cuanto se usó de tiempo.
>
> saludos y gracias.
>
> _______________________________________________
> Python-es mailing list
> [email protected]
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
_______________________________________________
Python-es mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/