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 <manuelcorte...@gmail.com>: > 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 > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/