TIMER... PRECISAO ?

CASTELO 15/08/2012 01:21:49
#407949
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
MARCELO.TREZE 15/08/2012 11:13:01
#407971
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


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

ROBSON 19/08/2012 16:25:22
#408159
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.
CASTELO 22/08/2012 20:13:33
#408385
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
CASTELO 23/08/2012 11:17:34
#408429
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...
CASTELO 23/08/2012 11:49:40
#408437
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...
Tópico encerrado , respostas não são mais permitidas