Hola.

Lo que pasa es que la función la puedes eejecutar sin parámetros o con dos parámetros que representan el minuto y la hora hasta la que quieres que cuente.

Si se ejecuta sin parámetros, empieza a contar hasta que recibe un KeiboardInterrupt, cuando lo recibe, lanza el valor de retorno que es una lista con el minuto y la hora que duró contando el tiempo.

Quisiera ver si manteniendo ejecutando el código con el hilo puedo hacer que el hilo detenga la función, no sé como, con alguna función stop o algo parecido...

Porque si no se detiene no podré saber el valor de retorno de la función: el minuto y la hora final que puse en los dos ifs, no recuerdo, pero creo que solo el primero me daba errores al momento de llegar a una hora o minuto finales, pero el segundo creo que era para una corrección, en fin, eso no lo he depurado, pero lo que me interesa en especial es saber como debo hacer para que pueda por ejemplo, enviarle desde un socket un mensaje que le diga al servidor que ejecute la función y otro que cuando la reciba el servidor detenga y regrese el valor de retorno o algo así, ya que no puedo hacer que se detenga la función, detengo el socket e incluso se desconecta, pero se sigue contando el tiempo y eso es lo que no puedo hacer.

Gracias.



El 20/12/11 06:04, G V escribió:
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/

_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a