martes, 5 de abril de 2011

Pausar un programa en C/C++

Me pasó que quería pausar por un momento un programa que hice en C++ y que después continuara la ejecución sin intervención del usuario, porque necesitaba eso, que vaya ejecutando una acción cada un cierto tiempo (algo así como un timer).
En todos lados encontraba como solución usar el getch(), pero el problema con eso es que el usuario necesita apretar una tecla para continuar. Además y peor, getch() no es compatible con todas las plataformas, viene incluida en la cabecera conio.h sólo para Windows.
Otra solución es usar system("pause"), pero también depende de la plataforma.
Buscando encontré un código para una función sleep() que recibe como parámetro la cantidad de milisegundos que querés que se pause el programa, y está hecho con funciones estándar, por lo que es compatible con cualquier plataforma y compilador.
Pueden ver el código acá, o bajarse este archivo .h que hice para simplificar las cosas. Para usar la función, solamente incluyan la cabecera con

#include "wait.h"

y cuando lo deseen, llamen a

wait(ms);

pasándole los milisegundos. Le cambié el nombre de sleep() a wait(), porque sleep() ya es una función existente y puede causar problemas.


El código funciona tanto en C como en C++.

3 comentarios:

  1. Pero te está comiendo el procesador.
    Quizás te convenga una compilación condicional de la plataforma.
    O usá una librería, que te provea de un timer.

    Por cierto getch de ncurses es multiplataforma.

    No se puede considerar la barrabasada de system("pause") como una solución, xP.

    Ah, si querés evitar conflictos de nombres, usá namespaces.
    wait también es una función existente

    ResponderEliminar
  2. Sí, de alguna hay que saber el tiempo transcurrido y eso consume CPU... Los timers de las librerías también de alguna forma tienen que saber cuándo pasó el tiempo especificado, aunque bueno, si están bien hechos deberían ser eficientes usando hardware (http://en.wikipedia.org/wiki/Timer#Computer_timers).
    La idea de este .h es justamente ésa, no tener que recurrir a librerías externas cuando se quiere disponer de una forma simple de pausar un programita, y digo programita porque también la idea es para usarlo en alguna aplicación de consola sencilla y de forma rápida. Obviamente para necesidades más complejas y programas más serios lo mejor sería recurrir a una librería con alguna herramienta especializada.
    Lo de ncurses es lo mismo, es una librería externa pero vale la aclaración.
    Lo de usar namespaces puede ser, seguro es la mejor solución. No sabía que hay otra función "wait", perdón por eso... :p.
    Gracias por el comentario de todas formas ;)

    ResponderEliminar
  3. Muchas gracias, era justo lo que estaba buscando (Y), te dejaria 10+, pero esto no es taringa. XD

    ResponderEliminar