Italian eseguire azioni ad intervallo di tempo

atomic

Member
Ciao a tutti.
Vorrei sapere, per cortesia, che metodo usare per eseguire delle azioni (funzioni,sub ) ogni n secondi/minuti o ore
di primo acchitto mi verrebbe di creare un pulsante e metterci dentro un ciclo while ed all'interno contare quanti secondi sono passati dall'ultimo evento e se sono passati >=n secondi lancia la funzione
sub command1
tini=ora attuale
conta=0
do while true
if diffInSecondi(ora attuale,tini)>=nsec then
funzione
conta=conta+1
end if
if oraAttuale> oraFine then
exit do
endif
loop
msgbox ("Finito")
end sub

a parte il metodo del ciclo while che credo mi esaurirebbe la batteria in poco tempo perchè nel caso reale dovrebbe ciclare per 12 ore (cioè da un orario ad un orario), quindi vi chiedo se esiste un altro metodo, dicevo mi manca proprio come calcolare la differenza in secondi tra due orari.
Ho fatto qualche ricerca, ma credo che non ci sia nulla di preparato tipo il datediff di vb.
Grazie
 
Last edited:

udg

Expert
Licensed User
Longtime User
Soluzioni diverse per esigenze diverse.
Se l'intervallo tra due eventi è di almeno 30 minuti, puoi utilizzare StartServiceAt
Se la frequenza è molto minore, dovresti acquisire un lock (phone.wakelock o qualcosa del genere) e attivare un timer. Anche se hai più eventi da far scattare, un unico timer potrebbe essere sufficiente, in quanto lo tareresti sull'intervallo minore ed incrementeresti una variabile che in pratica ti fa da multiplo. Semplici test (if, case..) ti permettono di lanciare le sub opportune.
L'unico vero problema da studiare con attenzione è se gli eventi rischiano di accavallarsi. Mi spiego meglio. Se lanci l'evento1 e e mentre questo è in corso parte l'evento2 che usa le stesse risorse puoi creare problemi. Un esempio banale:
alle 11:00 esegui il play di un file audio e alla 11:01 è previsto il play di un altro audio. Che succede se il primo play supera i 60 secondi? Che succede se il primo play non parte alle 11:00:00 ma con un certo ritardo e quindi sfora nel secondo?
 

udg

Expert
Licensed User
Longtime User
:) mi riferivo sempre all'intervallo tra due eventi. Quindi, giustamente, la frequenza degli eventi è maggiore (in una data unità di tempo), ma la frequenza intesa come "quanto frequentemente" accade un evento resta minore.
Approfitto per dire che le due tecniche potrebbero essere combinate. StartServiceAt "sveglia" l'app e poi un timer regola una serie di eventi in un tempo limitato. L'app si riaddormenta ed attende il successivo risveglio. In questo modo il consumo di batteria risulterebbe limitato.
O anche, al risveglio una serie di funzioni viene chiamata tramite WaitFor (in modo che ciascuna inizi solo dopo che la precedente sia terminata) e poi ci si riaddormenti sereni in attesa del prossimo risveglio.
 

amorosik

Expert
Licensed User
.... StartServiceAt "sveglia" l'app e poi un timer regola una serie di eventi in un tempo limitato. L'app si riaddormenta ed attende il successivo risveglio. In questo modo il consumo di batteria risulterebbe limitato.

Altola'
Questa del basso consumo e' interessante
Come fai a farla andare a 'riposo' e poi 'risvegliarla' ?
Solo da eventi interni (timer o simili) o anche da eventi esterni (sms, telefonate, ecc..)?
Non e' che c'e' qualche post 'istituzionale' sul power management ?
 

udg

Expert
Licensed User
Longtime User
Nulla di magico e misterioso, ci pensa Android!
Tu utilizzi StartService At per chiedere al sistema di svegliare la tua app "più o meno" a quell'ora (in pratica ti conviene anticipare di un paio di minuti rispetto all'orario reale perchè non è garantito che sarai svegliato esattamente all'orario indicato). Appena sveglio programmi il successivo risveglio.
Poi acquisisci un lock (per evitare che Android ti addormenti mentre hai ancora da fare)
Usi timer, wait for o quello che ti occorre (es. una lettura GPS, una sync verso un server..)
Togli il lock e Android (quando desidera) ti riaddormenta

Se il tempo tra lock e unlock è breve, il consumo della batteria diventa irrisorio.

Non ricordo esattamente, ma nell'esempio sull'uso (aggiornato) del GPS dovrebbe esserci praticamente tutto.
 

atomic

Member
Vi ringrazio per la partecipazione, ma lo scenario è molto più semplice, si tratta di inviare n sms (vedi mio ultimo post) ogni n secondi

Cerco di llustratre il workflow

1 - L'App viene avviata manualmente
2 - Se ci sono sms da inviare e se l'ora attuale è compresa in un intervallo oraInizio e oraFine
3 - inizia a lavorare ed ogni n secondi ( n>= 15 cmq) esegue una funzione (nello specifico invia un sms...vedi post precedente)
4 - se oraAttuale > OreFine e numSmsDaInviare>0 allora standby e ricordati di riattivarti alle ore OraIni (meno qualche minuto come suggerito da UDG)
5 - se gli sms sono finiti termina app altrimenti punto 4 ovvero dormi fino a oraIni meno qualche minuto e riprendi dal punto 2

non so se sono stato chiaro, spero di si :)
 

amorosik

Expert
Licensed User
In un giorno ci sono 24 x 3600 sec = 86.400 secondi
Se mandi un sms ogni 15sec o piu', ne puoi mandare solo 86400 / 15 = 5760 al giorno, al max
Ammesso che mandi via sms h24
Qual'e' il motivo del sms ogni 15 sec?
Non puoi sparare via a mitraglia invece di mandare tutti a dormire?
 

atomic

Member
Grazie per avermi risposto.

L'arco di tempo a disposizione è di 12 ore
In pratica ho 15.000 sms da spalmare in 3/4 giornate da 12 ore
i 15 secondi derivano da qui più o meno
in pratica ho un elenco di 15.000 numeri
e devo avvisarli con degli sms, ma siccome potrei avere problemi di spamming non invio a raffica, tutto qui
Cosa mi suggerisci per il workflow più indicato ?

questo è quello che mi verrebbe in mente di fare, ma non so...

probabile sub invio:
private Sub sInviaSms
    Dim nInvii As Int =0
    Dim OraAttuale,OraIni,OraFine As String
    OraIni="07:00:00"
    OraIni="19:00:00"
    Dim VettoreNumeri() As String ' già caricato
    Dim MaxNum As Int=VettoreNumeri.Length -1
    OraAttuale=DateTime.Now
    Dim SecAttesa As Int =15
    Dim uOra As String

   Do While True

        If OraAttuale>=OraIni And OraAttuale<=OraFine or nInvii>=MaxNum Then
            If nInvii <= MaxNum  Then
               If differenzaSecondi(uOra,DateTime.Now) >=SecAttesa Then              
                    invia sms vettoriNumeri(nInvii)
                    nInvii=nInvii+1
                    uOra =DateTime.Now
               end if
            Else
                Exit Do
            End If
        End If
    Loop
     Msgbox "Finito. Tutti gli sms sono stati inviati"
    termina app

End Sub

ciao :)
 
Last edited:

amorosik

Expert
Licensed User
12 ore x 3600 = 43.200 secondi utili ogni giorno
43.200 secondi / 15 secondi a sms = 2880 sms ogni giorno
Inviarne 15000 ci metti almeno 6 giorni
Con numeri cosi' elevati, quel che farei io, e' cercare il modo di inviarli il piu' rapidamente possibile
Se parli di spamming fai pensare di voler usare qualche servizio a gratis o giu' di li
Ma esistono servizi professionali che ti consentono l'invio di quanti sms vuoi, e' chiaro che qualcosa costicchiano
Ma un conto e' inviare tre sms per gioco, altra cosa inviarne decine di migliaia a settimana
 

atomic

Member
Grazie amorosik,
ho già fatto le mie valutazioni e considerazioni sui vari servizi, ti ringrazio per i suggerimenti
Ok, ma come faresti per il codice?
 

atomic

Member
Ok, grazie :)
Sai, per cortesia, come ottenere la differenza in secondi tra due orari ? e come verificare se una certa ora è compresa in una fascia oraria ?
Nel frattempo faccio qualche funzione e mi studio il DateTime...
Grazie :)
 

atomic

Member
Ti ringrazio...ottimo!
Scusa la banalità, ma come faccio per mostrare i risultati nella finestra log?
Non vorrei ogni volta installare sul cellulare l'app.
 

amorosik

Expert
Licensed User
Scusa la banalità, ma come faccio per mostrare i risultati nella finestra log?

Se intendi la finestra di log dell'ambiente di sviluppo, basta un:

dim variabile1 as string="Pirlotto"
Log("Messaggio per Giacomino => " & variabile1)

Ti consiglio di seguire i video nella sezione 'Learn / Video Tutorial'
Descrivono molte funzionalita' importanti
 

atomic

Member
Ho provato a fare quello che hai scritto...ma nn esce nulla nella finestra log, forse va inserito in una sub/modulo particolare ?
più tardi do un'occhiata ai video tutorial
Grazie :)
 
Top