Problema con un Temporizador

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.
Alepaff
Posts: 26
Joined: 17 Feb 2016, 21:03

Problema con un Temporizador

Post by Alepaff » 24 Feb 2016, 23:23

Hola, recientemente hice un temporizador, con una Gui y otros detalles, todo funciona correctamente, lo unico que quiero es que se detenga cuando llegue a cero exacto, este temporizador esta con un formato de Horas:Minutos:Segundos:Milisegundos. Yo creo que no es tan preciso por la pequeña fraccion que hay entre entre un comando y otro y que no es lo suficientemente rapido para detenerse. (O que tambien el Tooltip no puede ser tan preciso)
Aqui esta el Script:

Code: Select all

Gui Add, Text, x1 y12 w100 h20, Horas
Gui Add, Edit, x35 y10 w20 h20 Number limit gMax vHoras, 0		; vHoras: Crea la variable "Horas"

Gui Add, Text, x60 y12 w100 h20, Minutos
Gui Add, Edit, x100 y10 w20 h20 Number limit gMax vMinutos, 0		; "Number" solo se pueden escribir numeros     -    Si "Limit" se deja sin ningun numero (Ej: limit6 solo se puede hasta 6 caracteres) seguido va a admitir solo hasta donde llegue la Gui 

Gui Add, Text, x125 y12 w100 h20, Segundos
Gui Add, Edit, x175 y10 w20 h20 Number limit gMax vSegundos, 1	; 1 es el tiempo "default" en segundos

Gui Add, Checkbox, x220 y20 w100 h30 vMensaje, Mostrar mensaje al finalizar

Gui Font, Bold
Gui Add, Button, x10 y40 w190 h30 Default gComienzo, Empezar		; gComienzo hace que vaya a la direccion "Comienzo"

Gui, Show,, Introduzca el tiempo
return

GuiClose:
ExitApp

Max:
Gui, Submit, NoHide

if (StrLen(%A_GuiControl%) = 2)	;Si la longitud de algun control de la gui es igual a 2...
	Send {Tab}				; Va a presionar tab y va a pasar a la siguiente
return


Comienzo:
Gui, Submit, NoHide

Start := A_TickCount 

/*

Tambien funciona de esta manera

SetTimer, Aca, 1
Aca:
Loop{
   ToolTip, % ConvertToTime((Segundos * 1000) + (Minutos * 60000) + (Horas * 3600000) - (A_TickCount - Start))
   
    if (TimeLeft := ((Segundos * 1000) + (Minutos * 60000) + (Horas * 3600000) - (A_TickCount - Start))) < 0 {
	
        SetTimer, Aca, Off
        TimeLeft := 0
		break
		}
	}
*/

mmm := (Segundos * 1000) + (Minutos * 60000) + (Horas * 3600000)
	
Loop{
	ToolTip, % ConvertToTime(mmm - (A_TickCount - Start))
   
	;If (ConvertToTime((mmm - 994) - (A_TickCount - Start))) <= 0
	;If (ConvertToTime((mmm - (A_TickCount - Start)) - (A_TickCount - Start))) <= 0
	If (ConvertToTime(mmm - (A_TickCount - Start))) <= 0
	break	

}

;   	GuiControlGet, checked,, Mensaje
;	msgbox Hola
;	Mas tarde quería añadirle que cuando llegue al cero el usuario tiene la posibilidad de seleccionar si quiere que aparezca un mensaje o no, precionando la casilla, una vez que el tiempo llegó a cero.

Esc::Exitapp


ConvertToTime(ms) ;Formato en milisegundos 00:00:00:000 (Los ultimos 3 digitos son milisegundos)
{
	StringRight , mil , ms , 3
	StringTrimRight , sec , ms , 3
	min := Floor(sec/60)
	sec := sec-(min*60)
	hrs := Floor(min/60)
	min := min-(hrs*60)
	While StrLen(sec) <> 2
		sec := "0" . sec
	While StrLen(mil) <> 3
		mil := "0" . mil
	While StrLen(min) <> 2
		min := "0" . min
	While StrLen(hrs) <> 2
		hrs := "0" . hrs 
	return , hrs . ":" . min . ":" . sec . ":" . mil
}

Espero que puedan ayudarme con este pequeño problema
Gracias!



PD: Si quieren ignoren las anotaciones, ya que son apuntes mios xD
User avatar
Flipeador
Posts: 1018
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: Problema con un Temporizador

Post by Flipeador » 25 Feb 2016, 12:32

Code: Select all

SetBatchLines, -1

Gui Add, Text, x1 y12 w100 h20, Horas
Gui Add, Edit, x35 y10 w20 h20 Number limit gMax vHoras, 0		; vHoras: Crea la variable "Horas"
 
Gui Add, Text, x60 y12 w100 h20, Minutos
Gui Add, Edit, x100 y10 w20 h20 Number limit gMax vMinutos, 0		; "Number" solo se pueden escribir numeros     -    Si "Limit" se deja sin ningun numero (Ej: limit6 solo se puede hasta 6 caracteres) seguido va a admitir solo hasta donde llegue la Gui 
 
Gui Add, Text, x125 y12 w100 h20, Segundos
Gui Add, Edit, x175 y10 w20 h20 Number limit gMax vSegundos, 1	; 1 es el tiempo "default" en segundos
 
Gui Add, Checkbox, x220 y20 w100 h30 vMensaje, Mostrar mensaje al finalizar
 
Gui Font, Bold
Gui Add, Button, x10 y40 w190 h30 Default gComienzo, Empezar		; gComienzo hace que vaya a la direccion "Comienzo"
 
Gui, Show,, Introduzca el tiempo
return
 
GuiClose:
ExitApp
 
Max:
Gui, Submit, NoHide
 
if (StrLen(%A_GuiControl%) = 2)	;Si la longitud de algun control de la gui es igual a 2...
	Send {Tab}				; Va a presionar tab y va a pasar a la siguiente
return
 
 
Comienzo:
Gui, Submit, NoHide
 
Start := A_TickCount 
 
/*
 
Tambien funciona de esta manera
 
SetTimer, Aca, 1
Aca:
Loop{
   ToolTip, % ConvertToTime((Segundos * 1000) + (Minutos * 60000) + (Horas * 3600000) - (A_TickCount - Start))
 
    if (TimeLeft := ((Segundos * 1000) + (Minutos * 60000) + (Horas * 3600000) - (A_TickCount - Start))) < 0 {
 
        SetTimer, Aca, Off
        TimeLeft := 0
		break
		}
	}
*/
 
mmm := (Segundos * 1000) + (Minutos * 60000) + (Horas * 3600000)
 
Loop {
	ct := ConvertToTime(mmm - (A_TickCount - Start))
	ToolTip % ct


} until (StrReplace(ct, ":") <= 0)
ToolTip 00:00:00:000
 
;   	GuiControlGet, checked,, Mensaje
;	msgbox Hola
;	Mas tarde quería añadirle que cuando llegue al cero el usuario tiene la posibilidad de seleccionar si quiere que aparezca un mensaje o no, precionando la casilla, una vez que el tiempo llegó a cero.
 
Esc::Exitapp
 
 
ConvertToTime(ms) ;Formato en milisegundos 00:00:00:000 (Los ultimos 3 digitos son milisegundos)
{
	StringRight , mil , ms , 3
	StringTrimRight , sec , ms , 3
	min := Floor(sec/60)
	sec := sec-(min*60)
	hrs := Floor(min/60)
	min := min-(hrs*60)
	While StrLen(sec) <> 2
		sec := "0" . sec
	While StrLen(mil) <> 3
		mil := "0" . mil
	While StrLen(min) <> 2
		min := "0" . min
	While StrLen(hrs) <> 2
		hrs := "0" . hrs 
	return , hrs . ":" . min . ":" . sec . ":" . mil
}
 
Alepaff
Posts: 26
Joined: 17 Feb 2016, 21:03

Re: Problema con un Temporizador

Post by Alepaff » 25 Feb 2016, 16:42

Gracias. Muy buena idea la de remplazar el ultimo ToolTip que fallaba por poquito, por uno nuevo. Despues de unas modificaciones decidí dejarlo así

Code: Select all


Formato := (Segundos * 1000) + (Minutos * 60000) + (Horas * 3600000)

Loop{
	ToolTip, % ConvertToTime(Formato - (A_TickCount - Start))
	If (ConvertToTime((Formato - 994) - (A_TickCount - Start))) <= 0{
		break
		Goto Loopy		
	}

}	

Loopy:
Loop
		{
		ToolTip 00:00:00:000	 ;Lo puse dentro de un Loop para que siga al mouse
		}
		
Tambíen podría poner el Loop dentro del Loop pero prefiero dejarlo así
Y gracias por los comandos:

SetBatchLines -1
StringReplace
Until

No los conocía.
Post Reply

Return to “Pedir Ayuda”