Italian Timer autostop

Antonio67

Member
Ciao a tutti,volevo fare una domanda:ho un'app con un timer che lo fermo dopo un determinato tempo (diciamo 6 secondi) e volevo sapere se ce un'altro metodo oltre quello che uso io, e cioè:
Sub stop
dim x as int
x=x+1
If x=60 Then
Timer1.Enabled=False
x=0
End If

End Sub

Grazie
 

Gianni M

Well-Known Member
Licensed User
Longtime User
in quella Sub Stop il valore di x non sarà mai superiore a 1 !!!???
 

LucaMs

Expert
Licensed User
Longtime User
in quella Sub Stop il valore di x non sarà mai superiore a 1 !!!???
Esatto, perché reinizializza x all'interno della routine.
Dovresti usare una variabile globale (magari non chiamandola X ;))

Cmq, mi sa tanto che è proprio il concetto ad essere sbagliato:
Ciao a tutti,volevo fare una domanda:ho un'app con un timer che lo fermo dopo un determinato tempo (diciamo 6 secondi)
Vuoi far partire un timer dopo 6 secondi? Non è certo quello il modo, dato che x = 60 non significa 60 secondi.

Non sono sicuro di ciò che vuoi fare, ma se vuoi attivare un timer dopo che siano trascorsi 6 secondi, devi semplicemente usare due timer, il primo impostato con Interval = 6000 (cioè i 6 secondi) e al suo tick, lo disabiliti e abiliti l'altro.

Ricorda che i timer vanno dichiarati nella Process_Globals.
 

Antonio67

Member
Ciao luca. No non voglio far ripartire il timer dopo 6 secondi ma fermarlo dopo 6 secondi. Il codice mio funziona, solo che volevo sapere se cera un altro metodo. Tu come faresti?:rolleyes:
 

LucaMs

Expert
Licensed User
Longtime User
Quindi, diciamo che tu imposti il timer interval a 1000 (1 secondo), nella routine evento Tick esegui qualcosa ma se è stata eseguita 6 volte (6 secondi) vuoi disattivare il timer?
Se è così, puoi usare il metodo della X (nome da cambiare) dichiarata però nella Process_Globals oppure memorizzare in una variabile (sempre Process) l'orario in cui abiliti il timer (tipo Dim AvvioTimer As Long - AvvioTimer = DateTime.Now) e confrontarlo con quello nella routine Tick (If DateTime.Now - AvvioTimer >= 6000 Then Timer1.Enabled = False).

Se Invece la routine Tick deve scattare una solta volta dopo 6 secondi, devi semplicemente impostare Timer1.Interval = 6000 (o nell'inizializzazione) e disabilitarlo nella Tick (Timer1.Enabled = False)
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Ciao

È possibile creare un servizio e chiamare ogni volta x.

È anche possibile fare questo ciclo.
B4X:
log("Per attendere 5 secondi" & sleep(5000))



Public Sub Sleep(milisegundos As Long)
   Dim Actual As Int
   Dim t As Int
   
   Actual = DateTime.Now
   t= Actual
   
   Do Until (t-Actual) >= milisegundos
    t= DateTime.Now
     DoEvents
  Loop  

End Sub

Saluti
 

Antonio67

Member
Ciao, intressante anche se per il momento trovo piu facile da eseguire:
dim x as int
x=x +1
If x=60 then
Timer1..enabled=false
End if
Come vedi così non solo mi funziona ma il codice è anche piu corto, comunque grazie lo provero'
 

LucaMs

Expert
Licensed User
Longtime User
Non preoccuparti che il codice sia "piu corto"; è importante che funzioni (ovviamente), che sia ben "organizzato" e facilmente leggibile.

Il codice corto, più che altro l'eseguibile corto, può essere necessario solo in pochi sw, ad esempio un cronometro. Inoltre, appunto, non è detto che se il codice che scrivi è lungo lo sia anche l'eseguibile; ad esempio, se il nome di una variabile è X ma decido di cambiarlo e la chiamo CoordinataOrizzontale, l'eseguibile avrà lo stesso numero di byte.

Comunque, il codice proposto da @bgsoft (sconsigliato da Erel perché bloccherebbe il thread principale, anche se io non capisco il motivo, dato che si usa DoEvents; molto probabilmente il DoEvents non funziona come in VB.Net, ad esempio) serve per fare delle pause, non per il tuo scopo.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Comunque, il codice proposto da @bgsoft (sconsigliato da Erel perché bloccherebbe il thread principale, anche se io non capisco il motivo, dato che si usa DoEvents; molto probabilmente il DoEvents non funziona come in VB.Net, ad esempio) serve per fare delle pause, non per il tuo scopo.

Sì, hai ragione su Erel. Se non mettete questo codice in un servizio o un modulo di classe funziona perfettamente, ce l'ho in molti activitys e non mi ha dato problemi.

Saluti
 
Top