Página 1 de 1

Una formula

Publicado: 18 Nov 2010, 03:16
por Synx
Buenas. Estoy haciendo un programa que calcula la experiencia ganada durante una hora y durante 1 minuto para un juego. Se actualiza en tiempo real y tal. Me encontre con el problema de que necesito que el código calcule la duración de un segundo (algo así como el sleep) pero sin detener su ejecución durante ese tiempo. Hay algún modo de hacer eso? Se que lo que pregunto es confuso, yo tambien lo estoy con esto. Por poner un ejemplo común. Como haría para calcular las revoluciones por minuto de un coche con el dato de la velocidad actualizandose cada segundo? XD

Salu2

Re: Una formula

Publicado: 18 Nov 2010, 09:15
por Ximorro
A parte de las maneras de estar mirando constantemente el tiempo, quizás con las macros @SEC o @MSEC (o alguna llamada al sistema que haga algo similar) hay una muy cómoda, que consiste en poner un "avisador automático" cada segundo.
Tu programa está haciendo cualquier cosa (que puede ser simplemente estar esperando en un bucle que no hace nada) y cuando el tiempo del avisador termina automáticamente se ejecuta una función.
Se hace con las funciones Adlib, en versiones anteriores se hacía con AdlibEnable y AdlibDisable, en la última versión de AutoIt se sustituye AdlibEnable por AdlibRegister (se usan igual, la diferencia es que con la segunda puedes tener varios "avisadores" activos, y con la primera sólo uno).

Te muestro un pequeño ejemplo que muestra por consola los segundos que van pasando (yo uso AdlibEnable porque aún estoy con la versión 3.3.0) :

Código: Seleccionar todo

HotKeySet("{ESC}", "_Fin") ;Para finalizar con tecla Escape
Global $segun = 0
AdlibEnable("_MuestraMensaje", 1000) ;Cada 1000 milisegundos (o sea, un segundo) se ejecuta la función _MuestraMensaje

While True
	Sleep(10000) ;Ver comentarios después del dódigo...
WEnd

Func _MuestraMensaje()
	$segun += 1
	ConsoleWrite("Segundos transcurridos: " & $segun & @CRLF)
EndFunc

Func _Fin()
	AdlibDisable()
	ConsoleWrite("Proceso terminado." & @CRLF)
	Exit
EndFunc
Como el ejemplo es muy simple no hago un GUI, así que pongo un hotkey para cerrar el programa, y muestro los mensajes por la consola, pero eso es secundario, tú puedes tener tu GUI cerrable con un botón, y cada segundo en vez de sacar el mensaje miras la velocidad y calculas las revoluciones.

Fíjate que el programa es interrumpido donde esté cuando acaba el tiempo adlib, ¡incluso en un Sleep!. Esto es muy útil, y de hecho si mientras esperas a que pase el segundo no tienes que hacer nada es buena idea tenerlo en un bucle con Sleep, pues así la CPU queda muy liberada. Totalmente desaconsejado hacer algo así:
While True
Wend

Es decir, no poner ninguna pausa, en este caso la CPU te saltará al 100% y se quedará ahí, porque aunque el bucle no tenga instrucciones dentro, se están ejecutando las instrucciones del propio bucle...

Espero que sea esto lo que querías.
Talueeec

Re: Una formula

Publicado: 18 Nov 2010, 12:06
por Synx
Es justo lo que necesitaba! Y funciona perfectamente. Muchas gracias :smt041 ^^