Newsgroup: it.comp.lang.visual-basic
Titolo: Timer che "impazzisce"

Ciao ragazzi,
qualcuno ancora forse si ricorda di me :)
Vi lurko spesso, ma non ho il tempo materiale per scrivere.
Avrei un problema da risolvere.
Ho un timer su un form impostato a 60000 millisecondi.
La funzione è la seguente
Private Sub TimerCercaSpam_Timer()
     ... bla bla non interessante
      If CicliTimerSpam = 30 Then
         ... altro bla bla di preparazione degli md5...
	...sinapsi ha 5 minuti per calcolare tutto
         CicliTimerSpam = CicliTimerSpam + 1
     Else
         If CicliTimerSpam = 35 Then
             ... chiamo la funzione che scarica le definizioni
             CicliTimerSpam = 0
         End If
         CicliTimerSpam = CicliTimerSpam + 1
     End If
End Sub
La cosa strana che avviene ad alcuni utenti è che superato il primo 
ciclo di 35 minuti, il timer scatta ogni 90 secondi.
Da cosa può dipendere secondo voi? Può essere un problema del SP6 
applicato al mio VB6? O cos'altro?
Un abbraccio a tutti
Nicola


Quando è capitata a me una cosa simile era un errore di logica
dell'applicazione. Da allora, non uso mai i timer in modo rientrante :-).
Private Sub Timer1()
    Timer1.enabled=false
    ...
    ...
    ...
    Timer1.enabled=true
End Sub
Se ho bisogno di calcolare dei tempi all'interno, uso la
*funzione* Timer o altre funzioni di tempo. Per esempio,
se ho bisogno di controllare un timeout di un loop setto
un Timeout :-). Uso questa roba:
****************************
Dim TimeOut As Date
Dim TimeoutInMinuti As Integer
Dim TimeoutScattato As Boolean
Function SetTimeOut()
      TimeOut = Now
End Function
Sub ControllaTimeout(Optional Forzato As Integer)
      If Forzato Then TimeoutScattato = True: Exit Sub
      If Now > DateAdd("n", TimeoutInMinuti, TimeOut) Then
            TimeoutScattato = True
      Else
            TimeoutScattato = False
      End If
End Sub
Private Sub Timer1()
    Timer1.enabled=false
    SetTimeOut
    Do
        ... fa quello che deve fare
        ...
        ...
        If TimeoutScattato Then
            ...
            ...
            ...
            Timer1.enabled=true
            Exit Function
        End If
    Loop
    Timer1.enabled=true
End Sub
****************************
Bye, G. 

 ciclo di 35 minuti, il timer scatta ogni 90 secondi.
Secondo me Paperino ha ragione, il problema e' che il timer viene
richiamato ricorsivamente.
Forse nel tuo "... chiamo la funzione che scarica le definizioni" c'e'
qualche DoEvents?

Rispondo ad entrambi:
Il è là timer per richiamare periodicamente una funzione che scarica le 
definizioni.
Quindi sono costretto ad utilizzarlo :(
L'unica idea che mi è venuta è quella che durante lo scaricamento 
avvenga un qualche errore e la funzione esca dal suo normale ciclo, 
tanto che non si riesca poi ad azzerare "CicliTimerSpam = 0" e 
successivamente incrementare di 1.
In tal caso CicliTimerSpam resterebbe a 35 e quindi entrerebbe sempre 
nel "If CicliTimerSpam = 35 Then".
E da qui si può anche capire perchè ci sono 90 sec di attesa... 60 sono 
per il timer e 30 per il timeout dello scaricamento delle definizioni 
tramite Inet.
Ora provo ad azzerare il timer *prima* di entrare nello scaricamento 
delle definizioni.
Grazie ragazzi, vi faccio sapere.
Nicola

Ecco la soluzione.
Il timer chiamava una funzione che, in caso di errore, terminava con un 
messaggio di errore (un semplicissimo "on error goto").
Chiaramente il contatore non veniva azzerato e quindi restava sempre a 35.
Ora ho implementato un azzeramento anche nella zona di gestione degli 
errori e tutto và a meraviglia.
Un grazie a chi mi ha risposto ed un abbraccio a tutti,
Nicola