TIMER... PRECISAO ?
Falae rapaziada.
Tô aqui postando na madrugada pois estou tentando intender o motivo de um timer não bater com um player de audio
Então, estou utilizando o objeto WindowsMediaPlayer para tocar um mp3, então acontece o milagre srrsr
O TIMER e o Player iniciam junto, mas já no 1min é possÃvel notar um atrazo no TIMER e até chegar o final da MP3 passa de alguns segundos.
Utilizo Timer.interval = 1000
Att
Eliseu
Tô aqui postando na madrugada pois estou tentando intender o motivo de um timer não bater com um player de audio
Então, estou utilizando o objeto WindowsMediaPlayer para tocar um mp3, então acontece o milagre srrsr
O TIMER e o Player iniciam junto, mas já no 1min é possÃvel notar um atrazo no TIMER e até chegar o final da MP3 passa de alguns segundos.
Utilizo Timer.interval = 1000
Att
Eliseu
Bom colega pode estar acontecendo o seguinte, alguma função deve estar sendo executada no PC e esta função pode parar o timer por alguns segundos, isso não é regra mas ja tinha percebido isso e após algumas consultas cheguei a esta conclusão.
bom vc poderia fazer um teste com uma api e ver se acontece a mesma coisa
cole em um módulo
para iniciar o timer vc coloca em um botão ou no load do form o seguinte
para parar
e depois no unload coloque
bom teste e veja se mantém o tempo certo
bom vc poderia fazer um teste com uma api e ver se acontece a mesma coisa
cole em um módulo
Option Explicit
Private Declare Function SetTimer Lib [Ô]user32[Ô] _
(ByVal hWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib [Ô]user32[Ô] _
(ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long
Private m_TimerID As Long
[ô]Note: The duration is measured in milliseconds.
[ô] 1,000 milliseconds = 1 second
Public Sub StartTimer(ByVal Duration As Long)
[ô]If the timer isn[ô]t already running, start it.
If m_TimerID = 0 Then
If Duration > 0 Then
m_TimerID = SetTimer(0, 0, Duration, AddressOf TimerEvent)
If m_TimerID = 0 Then
MsgBox [Ô]Timer initialization failed![Ô]
End If
Else
MsgBox [Ô]The duration must be greater than zero.[Ô]
End If
Else
MsgBox [Ô]Timer already started.[Ô]
End If
End Sub
Public Sub StopTimer()
[ô]If the timer is already running, shut it off.
If m_TimerID <> 0 Then
KillTimer 0, m_TimerID
m_TimerID = 0
Else
MsgBox [Ô]Timer is not active.[Ô]
End If
End Sub
Public Property Get TimerIsActive() As Boolean
[ô]A non-zero timer ID indicates that it[ô]s turned on.
TimerIsActive = (m_TimerID <> 0)
End Property
Private Sub TimerEvent()
[txt-color=#007100][ô] aqui vc coloca sua função, ex: Form1.Label1.Caption = Format$(Now, [Ô]long time[Ô])[/txt-color]
End Sub
para iniciar o timer vc coloca em um botão ou no load do form o seguinte
Dim Interval As Long
Interval = 1000
MTimer.StartTimer Interval
para parar
MTimer.StopTimer
e depois no unload coloque
Private Sub Form_Unload(Cancel As Integer)
[ô]Clean-up! You don[ô]t want to leave the timer running.
If MTimer.TimerIsActive Then
MTimer.StopTimer
End If
End Sub
bom teste e veja se mantém o tempo certo
O Controle Timer embora a sua unidade de medida seja em milisegunsos, ele não tem precisão alguma já que depende de outros eventos do windows. Somente se o Windows não estivesse fazendo mais nada e apenas ele em operação pederia chegar proximo ao seu valor.
Para se trabalhar com calculos de horas, minutos, segundos com precisao use uma variavel de data hora. armazene o valor da hora dentro dela e depois refaça o calculo. Neste caso voce pode até usar um controle timer com o valor de 1 para monitorar o conteudo da variavelvariavel.
Para se trabalhar com calculos de horas, minutos, segundos com precisao use uma variavel de data hora. armazene o valor da hora dentro dela e depois refaça o calculo. Neste caso voce pode até usar um controle timer com o valor de 1 para monitorar o conteudo da variavelvariavel.
Falae galerinha,
Marcelo, testei seu exemplo, mas naum me encaixei bem srsrsr.
Vasculhei mais um pouco e achei um exemplo no site da própria microsoft.
Código para módulo
Option Explicit
Declare Function SetTimer Lib [Ô]user32[Ô] _
(ByVal hwnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib [Ô]user32[Ô] _
(ByVal hwnd As Long, _
ByVal nIDEvent As Long) As Long
Global iCounter As Integer
Sub TimerProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal idEvent As Long, _
ByVal dwTime As Long)
iCounter = iCounter + 1
Form1.Text1.Text = CStr(iCounter)
End Sub
Código para FORM1
Option Explicit
Dim lngTimerID As Long
Dim BlnTimer As Boolean
Private Sub Form_Load()
BlnTimer = False
Command1.Caption = [Ô]Start Timer[Ô]
End Sub
Private Sub Command1_Click()
[ô]Starts and stops the timer.
If BlnTimer = False Then
lngTimerID = SetTimer(0, 0, 200, AddressOf TimerProc)
If lngTimerID = 0 Then
MsgBox [Ô]Timer not created. Ending Program[Ô]
Exit Sub
End If
BlnTimer = True
Command1.Caption = [Ô]Stop Timer[Ô]
Else
lngTimerID = KillTimer(0, lngTimerID)
If lngTimerID = 0 Then
MsgBox [Ô]couldn[ô]t kill the timer[Ô]
End If
BlnTimer = False
Command1.Caption = [Ô]Start Timer[Ô]
End If
End Sub
Marcelo, testei seu exemplo, mas naum me encaixei bem srsrsr.
Vasculhei mais um pouco e achei um exemplo no site da própria microsoft.
Código para módulo
Option Explicit
Declare Function SetTimer Lib [Ô]user32[Ô] _
(ByVal hwnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib [Ô]user32[Ô] _
(ByVal hwnd As Long, _
ByVal nIDEvent As Long) As Long
Global iCounter As Integer
Sub TimerProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal idEvent As Long, _
ByVal dwTime As Long)
iCounter = iCounter + 1
Form1.Text1.Text = CStr(iCounter)
End Sub
Código para FORM1
Option Explicit
Dim lngTimerID As Long
Dim BlnTimer As Boolean
Private Sub Form_Load()
BlnTimer = False
Command1.Caption = [Ô]Start Timer[Ô]
End Sub
Private Sub Command1_Click()
[ô]Starts and stops the timer.
If BlnTimer = False Then
lngTimerID = SetTimer(0, 0, 200, AddressOf TimerProc)
If lngTimerID = 0 Then
MsgBox [Ô]Timer not created. Ending Program[Ô]
Exit Sub
End If
BlnTimer = True
Command1.Caption = [Ô]Stop Timer[Ô]
Else
lngTimerID = KillTimer(0, lngTimerID)
If lngTimerID = 0 Then
MsgBox [Ô]couldn[ô]t kill the timer[Ô]
End If
BlnTimer = False
Command1.Caption = [Ô]Start Timer[Ô]
End If
End Sub
Eu acho que me adiantei ontem em fechar o tópico, porém vou reabri-lo para compartilhar uma dificuldade e juntos buscarmos uma alternativa
Estava achando que meu sistema estava funcional, e assim posso considerá-lo, porém uma pedra apareceu no caminho.
Vamos ao caso.
Programei um temporizador para um programa de streaming (Wirecast).
Utilizo uma DLL para ler as mÃdias e calcular o tempo de cada uma, este valor é retornado em segundos.
Monto a playlist selecionando as mÃdias (Músicas e VÃdeos) e envio um a um para o programa.
Para determinar o tempo de cada música ou vÃdeo, realizo um calculo do tempo e inicio o timer, que ao final do tempo, envia o novo arquivo ao sistema e apaga o anterior. E novamente inicalizo o TIMER com o novo tempo.
Bom, até ai tudo bem, isso está funcionando.
O que acontece agora é assim.
O usuário a qualquer momento pode adicionar novos arquivos, acontece que esse procedimento trava o TIMER, pois arquivos de audio grandes e filmes demoram cerca de 2 a 3 segundos ou mais... para serem lidos assim o TIMER fica esse tempo parado.
Estou precisando idealizar uma forma de vincular o TIMER ao CLOCK do Sistema.
Aguardo sugestões...
Estava achando que meu sistema estava funcional, e assim posso considerá-lo, porém uma pedra apareceu no caminho.
Vamos ao caso.
Programei um temporizador para um programa de streaming (Wirecast).
Utilizo uma DLL para ler as mÃdias e calcular o tempo de cada uma, este valor é retornado em segundos.
Monto a playlist selecionando as mÃdias (Músicas e VÃdeos) e envio um a um para o programa.
Para determinar o tempo de cada música ou vÃdeo, realizo um calculo do tempo e inicio o timer, que ao final do tempo, envia o novo arquivo ao sistema e apaga o anterior. E novamente inicalizo o TIMER com o novo tempo.
Bom, até ai tudo bem, isso está funcionando.
O que acontece agora é assim.
O usuário a qualquer momento pode adicionar novos arquivos, acontece que esse procedimento trava o TIMER, pois arquivos de audio grandes e filmes demoram cerca de 2 a 3 segundos ou mais... para serem lidos assim o TIMER fica esse tempo parado.
Estou precisando idealizar uma forma de vincular o TIMER ao CLOCK do Sistema.
Aguardo sugestões...
Fiz esse teste aqui e parece que funcionou....
Public duracao, inicio, final
Private Sub Form_Load()
duracao = Label2.Caption [ô]em segundos
inicio = Time [ô]hora de inicio do timer
final = DateAdd([Ô]s[Ô], duracao, inicio) [ô]hora de encerramento do timer
Text1.Text = inicio
Text2.Text = final
End Sub
Private Sub Timer1_Timer()
Text3.Text = DateDiff([Ô]s[Ô], Time, final) [ô]contador regressivo em segundos
Text4.Text = Format(DateAdd([Ô]s[Ô], Text3.Text, Date), [Ô]HH:nn:ss[Ô]) [ô]contador regressivo em formato hh:mm:ss
End Sub
Esse esquema é uma solução fácil, pois gravo a hora de inicio e a hora de encerramento e no timer apenas realizo o calculo datediff.
Por final a questão é... e se o usuário as 49 do segundo tempo... ou seja, no final de um track resolver adicionar novo arquivo, esse arquivo pode demorar para ter sua duração calculada, sem dúvida o timer irá parar, ou seja, não irá calcular. O track terá encerrado no sistema (Wirecast) e quando o sistema voltar.... o contador irá zerar, mas atrazado, pois o sistema estava ocupado...
Public duracao, inicio, final
Private Sub Form_Load()
duracao = Label2.Caption [ô]em segundos
inicio = Time [ô]hora de inicio do timer
final = DateAdd([Ô]s[Ô], duracao, inicio) [ô]hora de encerramento do timer
Text1.Text = inicio
Text2.Text = final
End Sub
Private Sub Timer1_Timer()
Text3.Text = DateDiff([Ô]s[Ô], Time, final) [ô]contador regressivo em segundos
Text4.Text = Format(DateAdd([Ô]s[Ô], Text3.Text, Date), [Ô]HH:nn:ss[Ô]) [ô]contador regressivo em formato hh:mm:ss
End Sub
Esse esquema é uma solução fácil, pois gravo a hora de inicio e a hora de encerramento e no timer apenas realizo o calculo datediff.
Por final a questão é... e se o usuário as 49 do segundo tempo... ou seja, no final de um track resolver adicionar novo arquivo, esse arquivo pode demorar para ter sua duração calculada, sem dúvida o timer irá parar, ou seja, não irá calcular. O track terá encerrado no sistema (Wirecast) e quando o sistema voltar.... o contador irá zerar, mas atrazado, pois o sistema estava ocupado...
Tópico encerrado , respostas não são mais permitidas