Evento a determinada hora
Publicado por Juan (18 intervenciones) el 22/08/2006 18:01:16
Me hice una aplicación que es un despertador. Es un form donde se carga la hora/minuto y se elige una canción para que suene. Funciona bien.
La manera en que programe el evento de "sonar el despertador" es del tipo Timer (no use el control, sino código). Lo que hace es restar la hora programada a la hora actual, calcular el numero de segundos, empezar a contar los segundos transcurridos y al llegar al total, se ejecuta la canción (identico al control Timer).
Lo que quiero hacer es que no dependa del "nº de seg calculado" sino de la hora real del sistema. No se como programa un evento que chequee la hora y la compare con la programada. El método actual falla por ejemplo, si cambio la hora del sistema, el despertador sonará cuando se cumplan los X segundos, independientemente si la hora real es la programada para sonar o no.
En VBA utilizaba la función "Ontime" pero en VB 6.0 no la puedo hacer andar.
Espero que se haya entendido. He leído cientos de post sobre timer y otros, pero no he encontrado lo que quiero.
Saludos
Juan
Este es el código actual (usa una API)
Public Declare Function SetTimer Lib "user32" ( _
ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" ( _
ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public TimerID As Long
Public TimerSeconds As Single
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Sub temporal(hora_prog, cancion, activa)
StartTimer (hora_prog)
If activa = 0 Then
Form1.Label3.Caption = Empty
Form1.Label4.Caption = Empty
Form1.Option1 = False
Form1.Option2 = False
EndTimer
End If
End Sub
Sub StartTimer(hora_prog)
hora_act = Time
If hora_act > hora_prog Then
dif = TimeValue("23:59:59") - hora_act
hora_prog = hora_prog + dif
hora_act = TimeValue("00:00:00")
End If
tiempo_rest = (hora_prog - hora_act) * 60 * 60 * 24
TimerSeconds = tiempo_rest ' how often to "pop" the timer.
TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)
End Sub
Sub EndTimer()
On Error Resume Next
KillTimer 0&, TimerID
End Sub
Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, _
ByVal nIDEvent As Long, ByVal dwTimer As Long)
' The procedure is called by Windows. Put your
' timer-related code here.
cancion = Form1.Label4
ShellExecute 0, "open", cancion, "", "", 1
Form1.Label3.Caption = Empty
Form1.Option1 = False
EndTimer
End Sub
La manera en que programe el evento de "sonar el despertador" es del tipo Timer (no use el control, sino código). Lo que hace es restar la hora programada a la hora actual, calcular el numero de segundos, empezar a contar los segundos transcurridos y al llegar al total, se ejecuta la canción (identico al control Timer).
Lo que quiero hacer es que no dependa del "nº de seg calculado" sino de la hora real del sistema. No se como programa un evento que chequee la hora y la compare con la programada. El método actual falla por ejemplo, si cambio la hora del sistema, el despertador sonará cuando se cumplan los X segundos, independientemente si la hora real es la programada para sonar o no.
En VBA utilizaba la función "Ontime" pero en VB 6.0 no la puedo hacer andar.
Espero que se haya entendido. He leído cientos de post sobre timer y otros, pero no he encontrado lo que quiero.
Saludos
Juan
Este es el código actual (usa una API)
Public Declare Function SetTimer Lib "user32" ( _
ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" ( _
ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public TimerID As Long
Public TimerSeconds As Single
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Sub temporal(hora_prog, cancion, activa)
StartTimer (hora_prog)
If activa = 0 Then
Form1.Label3.Caption = Empty
Form1.Label4.Caption = Empty
Form1.Option1 = False
Form1.Option2 = False
EndTimer
End If
End Sub
Sub StartTimer(hora_prog)
hora_act = Time
If hora_act > hora_prog Then
dif = TimeValue("23:59:59") - hora_act
hora_prog = hora_prog + dif
hora_act = TimeValue("00:00:00")
End If
tiempo_rest = (hora_prog - hora_act) * 60 * 60 * 24
TimerSeconds = tiempo_rest ' how often to "pop" the timer.
TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)
End Sub
Sub EndTimer()
On Error Resume Next
KillTimer 0&, TimerID
End Sub
Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, _
ByVal nIDEvent As Long, ByVal dwTimer As Long)
' The procedure is called by Windows. Put your
' timer-related code here.
cancion = Form1.Label4
ShellExecute 0, "open", cancion, "", "", 1
Form1.Label3.Caption = Empty
Form1.Option1 = False
EndTimer
End Sub
Valora esta pregunta


0