Como hacer Bucle un determinado tiempo

Iniciado por Alvaro.s, 14 Julio 2015, 11:11 AM

0 Miembros y 1 Visitante están viendo este tema.

Alvaro.s

Hola amigos. Soy nuevo en el foro y antes de nada gracias por leer el mensaje y las contestaciones.

Estoy intentando hacer un bucle que se ejecute 5 segundos solo y después salga del bucle.
Como puedo hacer eso?

Saludos y gracias.

x64core

Cita de: Alvaro.s en 14 Julio 2015, 11:11 AM
Hola amigos. Soy nuevo en el foro y antes de nada gracias por leer el mensaje y las contestaciones.

Estoy intentando hacer un bucle que se ejecute 5 segundos solo y después salga del bucle.
Como puedo hacer eso?

Saludos y gracias.
Crea dos hilos, uno seria el que haga la tarea que quieres y el segundo esperará durante los 5 seg por el primer hilo sino lo termina o lo suspende, etc.

ivancea96

Usando time(0) de la librería time.h, guardas el tiempo de comienzo en una variable. Luego, compruebas cuanto tiempo pasó en cada ciclo (tiempoAhora - tiempoAntes).
time(0) retorna un número en segundos. Con eso, te llega para hacer lo que buscas. Ya si quieres profundizar en el manejo de tiempo: http://www.cplusplus.com/reference/ctime/time/

También tienes la librería chrono en C++11, pero ya es más complicada.

#include <time.h>

/* ... */

time_t start = time(0);

do{
/* ... */
while(time(0)-start>5);

x64core

Pensé acerca de ese tipo de enfoque usando un tipo de TickCount, pero ivancea96, con eso realmente se puede asegurar que el hilo solo se ejecutara 5 segundos? y si por algun motivo el hilo nunca alcanza la parte while o durante la comprobacion la funcion retorna 4.9 y de nuevo se vuelve a ejecutar el codigo?

ivancea96

#4
En primer lugar, no puede devolver 4.9 porque no es coma flotante, y es en segundos.

He de decir, que ese supuesto "4.9", también se cumple en tu código. Puede faltarte unos milisegundos para acabar a tu thread, y el otro, volver a comenzar el bucle.

En cualquier caso, el tiempo máximo posible será de (5s + tiempo del código del bucle en el peor caso), aproximadamente. Es algo inevitable, salvo que dentro del código del bucle se pongan comprobantes del tiempo.

También se podría precalcular el tiempo que puee tardar en el bucle, y hacer mediciones con clock() para intentar exactitud. Pero no creo que se necesite tal exactitud.

x64core

#5
Cita de: ivancea96 en 14 Julio 2015, 13:37 PM
En primer lugar, no puede devolver 4.9 porque no es coma flotante, y es en segundos.

He de decir, que ese supuesto "4.9", también se cumple en tu código. Puede faltarte unos milisegundos para acabar a tu thread, y el otro, volver a comenzar el bucle.

En cualquier caso, el tiempo máximo posible será de (5s + tiempo del código del bucle en el peor caso). Es algo inevitable, salvo que dentro del código del bucle se pongan comprobantes del tiempo.

Cuando mencione 4.9 me referia a calcular el valor desde los milisegundos.

El mayor problema que veo con ese enfoque es sobre tener el control del tiempo de ejecucion ya que si por algun motivo el codigo nunca alcanza la comprobacion en el while o tarda más del tiempo establecido ya que el mismo hilo estaria intentando controlar su propio tiempo de ejecucion. Diria que ese enfoque seria mas como ejecutar código por al menos un tiempo especifico.

El que yo sugiero seria crear el Worker thread y esperar por este a que ya sea pase el tiempo establecido o el hilo termine, claro que para determinar el tiempo del worker thread usaria las funciones de sincronizacion y no con funciones de tiempo.







ivancea96

¿Y pretenderías terminar el hilo por la fuerza? En mi método, dejamos que el hilo acabe. Salvo que así sea, el otro método es cerrarlo por la fuerza. Y cerrar por la fuerza puede dejar memoria suelta, y si fuera C++, ya ni hablamos.

x64core

Sí, aunque se podria encapsular todos los recursos que serian usados en el hilo en una clase asi antes de crear el worker thread creamos un objeto y pasamos el puntero al objeto ya sea si termina comprobamos el estado del objeto, incluso asi no es 100% seguro.

ivancea96

Claro. Incluso una clase, al acceder, acabarías pudiendo cerrando el thread en malos momentos. Incluso un simple array podría quedar mal xD

Mejor con una comprobacion simple en el bucle, asegurandolo todo.

x64core

Cita de: ivancea96 en 14 Julio 2015, 15:42 PM
Claro. Incluso una clase, al acceder, acabarías pudiendo cerrando el thread en malos momentos. Incluso un simple array podría quedar mal xD

Mejor con una comprobacion simple en el bucle, asegurandolo todo.
Podria ser 100% seguro, eso depende para qué tipo de tareas, el ejecutar un hilo por un cierto tiempo podria ser ideal para tareas de completacion en una pila de hilos que solo podrian ejecutar por cierto tiempo y donde no se requiera más recursos de los reservados sino para liberar los recursos.

Y si por algun motivo se require reservar memoria en el hilo eso significaria que el problema se está resolviendo de una manera incorrecta o bien este enfoque no es para el tipo de tareas para el cual se está intenta hacer.

Asi que yo dí mi solucion para el problema -> Ejecutar por un cierto limite de tiempo.
Tu solucion no es para ese tipo de problema o almenos eso es lo que entendi del primer Post del usuario.