¿Alguna vez has querido hacer que un programa en C detenga su ejecución durante cierto período de tiempo? Puedes establecer una técnica para que el tiempo transcurra, por ejemplo: mientras muestras una página de bienvenida (una notificación o una indicación) para un juego. Hola!Generar retardos en un programa es algo poco habitual (y algunas personas piensan que poco recomendable).
Retardos Básicos con Bucles Vacíos
Una de las formas más elementales de crear un retardo es mediante un bucle de repeticiones sin operaciones significativas. Creo que debes seguir el siguiente codigo y la rutina te va a funcionar:
void retardo( int ciclos ) { int cuenta; for ( cuenta = 0; cuenta < ciclos; cuenta++ {}}En este esquema el programa se quedará en espera mientras el ciclo se cumple. La sentencia seguida por un signo ";" hará que la computadora ejecute el bucle 100 veces sin producir ningún evento perceptible. Sin embargo, esta técnica básica presenta varias imprecisiones y limitaciones:
- En C no se pueden hacer delay de esa manera, porque el tiempo total depende del compilador, en como traduce las lineas "C" en su respectivo assembler.
- Ahh entonces al usar void retardo no significa que demorara la cantidad de ciclos asignados no? entonces estaba en lo cierto cuando en el winide me dio muchos mas ciclos. Exacto.
- Ten en cuenta que al utilizar la técnica del bucle for, podrías necesitar un lapso muy grande para i, ya que una sentencia vacía se ejecuta con mucha rapidez.
- Si estás utilizando el bucle for, el compilador podría optimizar el código, y, como el bucle no hace nada, eliminarlo.
- Esta técnica generalmente resulta inútil en casos que no sean más que un programa trivial.
- Además, hacer que un bucle se repita N veces, dependiendo de la ejecución de una instrucción, podría tener un resultado inesperado.
Uso de Funciones delay() de Librería
Aún así si quisieras generar un retardo puedes intentarlo con la función delay. Ejemplo:
#include<stdio.h>#include<stdlib.h>main(){ printf("Maravilla perdida"); printf("El programa terminará en 10 segundos.\n"); delay(10000); return 0;}La implementación de estas funciones puede variar significativamente entre sistemas operativos y entornos de desarrollo. He compilado el programa que me has enseñado y me da problemas con la función delay. El problema es que estoy usando el software de linux ubuntu y la mitad de las librerias y funciones válidas para windows en linux no funcionan. Consejo: En algunos sistemas, el valor podría estar indicado en segundos en lugar de milisegundos. Ok Muchas gracias por sus respuestas, estaría bueno que en ese sentido sea como el ccs que simplemente con poner delay_ms(x) ya genera el delay.
Lea también: IVA 21% Excel
Métodos Avanzados y Control de Tiempo No Bloqueante
Para una gestión del tiempo más precisa y eficiente, especialmente en aplicaciones interactivas, se prefieren enfoques que no detengan completamente la ejecución del programa, permitiendo la realización de otras tareas durante el "tiempo muerto".
- En general, puedes usar cronómetros o una aproximación dirigida por eventos para implementar esto. De otra forma, el programa no responderá durante el tiempo de espera, y muchas veces esto no es bueno.
- La función Cpu_Delay100US justamente genera la una demora de 100 us en base a la frecuencia de clock, el ProccessExpert ajusta este valor, metiendo o sacando instrucciones y está enteramente hecha en assembler.
- La diferencia de usar este tipo de delays es que tu programa no continua hasta que finalice la función, en cambio usando un timer, podes aprovechar ese tiempo muerto para hacer otras tareas.
Supongamos que tengo un solo timer como el jl3 y lo estoy usando para generar una interrupción por timer y necesito hacer otra demora no tan precisa entonces lo mas conveniente me parece que es usar una rutina de assembler no?
Control de Tiempo en Desarrollo de Juegos
En el contexto del desarrollo de juegos y animaciones, el uso de funciones de retardo que bloquean la ejecución es generalmente desaconsejable debido a la pérdida de rendimiento. bueno, antes de que vengan a decirte que no uses gotxy() y todas esos metodos no standard (lo cual no deberias jeje), yo pienso que si tu objetivo es hacer juegos, es tambien muy importante ( o mas ) aprender que NUNCA debes de usar delay() o funciones similares, ya con eso perderas valiosos segundos de calculos que algun dia desearas tener (yo estoy pasando por algo asi ahorita con mi juego). Ahora, en este tipo de casos, hacer un ciclo así, es algo DEMASIADO rápido, y por eso te ves forzado a usar delay(). La solución más eficaz es implementar un movimiento basado en el tiempo:
- Hacer tu movimiento basado en el tiempo.
- Manejar el movimiento con el teclado y/o el mouse.
El movimiento basado en tiempo (Time Based Movement), es para que puedas mantener a cierta velocidad el movimiento de tus objetos, en este caso sería para controlar la velocidad con que se mueve la "g". Para esto debes calcular el tiempo (en segundos) entre cada frame (cada que se procesa un ciclo), luego, multiplicar el tiempo transcurrido por la velocidad que deseas. Realmente nunca pasé por tratar de aplicar algo así a un programa en modo consola, pero en teoría debería de poderse implementar también.
Recomendaciones para Animaciones y Gráficos
Para quienes buscan implementar animaciones y gráficos, es aconsejable utilizar librerías especializadas. Lo que te recomiendo, es que si ya sabes C, y ya quieres empezar a hacer pruebas de animacion, empieces a aprender una libreria que te permita trabajar en modo de ventana. Te recomendaría usar SDL o Allegro. Con esto, ya vas a poder desplegar dibujos de forma MUY MUY sencilla (puede ser desde 1 pixel, hasta imagenes de diversos formatos), y hacer el tipo de pruebas que estas tratando ahorita....
Lea también: Guía IVA reducido
El "Delay" en el Procesamiento de Audio
Existe otro contexto donde el término "delay" se utiliza, no para pausar la ejecución del programa, sino como un efecto de procesamiento de señal. Hola, este es mi primer post, intentaré explicarme lo mejor que sé. Estoy diseñando un plug-in de sonido con la SDK de Steinberg bajo el entorno de visual studio 2008 sobre un Windows XP 32 Bits. El lenguaje de programación es C++. Ahora mismo, estoy implementando el efecto del Delay, más conocido como eco en algunos casos. No es más que retardar unas muestras de la entrada y sumarlas a la salida. El código funciona de la siguiente manera: Un archivo process.cpp es el encargado del procesado de la señal que entre los metodos de definición de buses y diferentes canales tiene un metodo process() que se encarga del propio procesado de audio teniendo como atributos un tipo de dato "data" que hace referencia a las muestras que le llegan a la entrada (En este caso, el número de muestras será de 2048).
En este escenario, es fundamental la gestión de un búfer para almacenar y procesar las muestras con retardo.
buffdelay = (float*) malloc(2048*sizeof(float*)); //En esta instrucción lo que pretendo hacer es reservar un memoria para 2048 elementos tipo float.
Surgen preguntas sobre la implementación de dicho búfer: ¿Dónde debería escribir este buffer de delay (buffdelay)? ¿Dentro de propio While? Luego, creo que la actualización del buffdelay sería fuera del while, pero estoy un poco perdido en cuanto a la implementación incluso quizá no estoy seguiendo la metodología adecuada.
Lea también: ¿Cómo localizar tus XML del SAT?
