Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di e444
    Registrato dal
    Jan 2012
    Messaggi
    37

    [VB.NET] Estendere il tempo di un Timer

    Ciao
    Ho un altro problema che onestamente non mi so spiegare...

    Sempre per quel programma che sto facendo, è presente un timer che viene avviato e che allo scadere deve accadere tutta una serie di faccende... ora... il problema non è quello che deve accadere... ma sta nel fatto che mi è stata chiesta la necessità di poter estendere il tempo del timer all'occorrenza.

    Per semplificarmi la vita, anche perche ci sono più di 50 timer indipendenti, ho optato per un conto alla rovescia a livello dei soli secondi, quindi, ho inserito, dove mi serviva, una label con scritto "3600" che non sono altro che i secondi di 1 ora.

    Ora... potrebbe verificarsi la necessità che durante il trascorrere di questo, o di questi timer, devo poter estendere il timer, per esempio, di altri 3600 secondi.

    Sono riuscito a fare il tutto... il problema sta nel fatto che quando vado a sommare gli aggiuntivi 3600 secondi, il programma mi fa ripartire il timer da capo!...
    Cerco di spiegarmi meglio...

    Se avvio il timer e per esempio mi trovo a 2000 secondi dallo scadere, quando vado a sommare i 3600, invece di modificarmi la label a 5600 (2000 + 3600), vedo che la label mi parte da 7200 e quindi è come se non mi riconosce l'attuale "numero" della label e, nonostante la sottrazione generata dal timer tramite questo codice:

    codice:
    LBTimerS1P1.Text -= 1
    (che non è altro che il nome della label sotto forma di numero "3600" = se stesso - 1 ciclato ogni secondo)... fin qui molto semplice... ma non capisco perche, all'evento click del comando "estendi", nonostante gli dica di far riferimento alla label in questione, lui non ne tiene conto del conteggio e considera come numero non quello scalato, ma quello di partenza... cioè il "3600".

    Ho provato in vari modi... ma in tutti... non mi risolvo il problema...
    Ecco alcuni modi che ho provato e non hanno funzionato...

    codice:
    FormPrincipale.LBTimerS1P1.Text = Val(FormPrincipale.LBTimerS1P1.Text) + Val(Est)
    FormPrincipale.LBTimerS1P2.Text += Val(Est)
    FormPrincipale.LBTimerS1P2.Text = +Est
    ora vero che praticamente il primo e il secondo modo sono la stessa cosa... ma alle volte... si sa mai!..

    Premetto che "Est" è il valore numerico da estendere... in quanto nell'evento click del comando "Estendi" è riportato quanto segue:

    codice:
    Dim Est As Integer
    
    If RB1ora.Checked = True Then
                Est = 3600
    End If
    If RB2ore.Checked = True Then
                Est = 7200
    End If
    If RB3ore.Checked = True Then
                Est = 10800
    End If
    
    ed altro...
    Sapete dirmi come mai mi crea questo inconveniente? o come posso sistemarlo visto che sono già 2 giorni che ci perdo tempo?

    Grazie mille
    Ale.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Anche se ammetto di aver letto molto velocemente il messaggio, provo a fornire un suggerimento che potrebbe risolvere il problema alla radice: invece di usare una temporizzazione così precisa con i Timer, che in realtà così precisi non sono mai, perché non usi un intervallo sensibilmente più basso (es. pochi secondi) e magari non gestisci altrove il controllo del tempo che è trascorso?

    Spiegandomi meglio, puoi usare un Timer che vada in esecuzione spesso, più frequentemente dell'intervallo effettivo che ti serve, e all'interno del codice di gestione dell'evento fare le opportune verifiche per determinare se, in base ai criteri che devi implementare, il tempo che ti sei prefissato è effettivamente trascorso oppure no.

    In breve, deleghi al codice l'effettivo calcolo del tempo che è trascorso, indipendentemente da quando viene eseguito il timer.

    Ricorda che puoi sempre sottrarre delle date e ottenere degli oggetti TimeSpan che ti forniscono il tempo trascorso, oppure prendere una certa data/ora e sommare a essa del tempo, sfruttando i metodi forniti dal tipo DateTime, in modo da determinare la data/ora in cui dovrà accadere un certo evento, e poi scrivere il codice necessario a controllare se quel momento è stato raggiunto oppure no, indipendentemente dal Tick del Timer, aggiornandolo di conseguenza se ti serve (come nella condizione che hai espresso nel tuo problema).

    So che la spiegazione è puramente teorica e manca un esempio di codice, ma può essere già uno spunto di riflessione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di e444
    Registrato dal
    Jan 2012
    Messaggi
    37
    Grazie per il tuo intervento ma... non risolvo così il mio problema. :-) o meglio... mi vado ad incasinare molto di più...

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Quote Originariamente inviata da e444 Visualizza il messaggio
    Grazie per il tuo intervento ma... non risolvo così il mio problema. :-) o meglio... mi vado ad incasinare molto di più...
    Giusto una domanda così per sapere... hai almeno provato?
    A me pare che tu ti stia incasinando molto di più in questo momento, almeno dal codice che hai scritto.

    In fondo, il valore temporale che ti serve si può memorizzare in una variabile una volta determinato, e aggiornarlo quando serve, senza andare a verificare lo stato del timer, cambiarne l'intervallo (che non è una scadenza ovvero è periodica), ecc.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Probabilmente non ho capito benissimo, ma se ho ben inteso MENTRE il timer è in funzione devi AGGIUNGERE dei secondi a quelli già trascorsi, per cui devi evidentemente tener conto dei secondi trascorsi.

    Per cui: Dim StartTime as DateTime (dichiarata a livello di classe o globale)

    all' inizio dell' evento timer... StartTime = Now

    e poi: FormPrincipale.LBTimerS1P2.Text+=Val(Est) -(Now-StartTime).TotalSeconds
    Ultima modifica di eziogsv; 05-01-2018 a 00:55

  6. #6
    Utente di HTML.it L'avatar di e444
    Registrato dal
    Jan 2012
    Messaggi
    37
    No.... non va....

    Il timer mi riparte sempre da 7200....

    Io come prova, faccio partire i Timer, poi quando arriva a 3500 faccio la procedura per implementare i 3600 secondi in più... ma quando do la conferma, invece di vedere il timer ripartire da 7100, vedo che parte da 7200, quindi, continua a non tenermi conto i 100 secondi trascorsi...

    Allora...
    Tenere conto che:
    1) la label del conto alla rovescia (LBTimerS1P1) si trova nel Form Principale
    2) il comando di estensione della durata si trova in un Form Secondario

    L'unico dubbio che posso aver sbagliato la collocazione del "StartTime = Now"... perche non ho capito cosa intendi dicendo "all'inizio dell'evento timer"

    Intendi dire "prima" del comando "Timer.Start"?

    Comunque sia, l'ho collocato in vari punti... ergo... ho fatto varie prove ma... niente da fare... il tempo trascorso, non me lo calcola!...

    Uffa...
    :-(

  7. #7
    Quote Originariamente inviata da e444 Visualizza il messaggio
    Io come prova, faccio partire i Timer, poi quando arriva a 3500 faccio la procedura per implementare i 3600 secondi in più... ma quando do la conferma, invece di vedere il timer ripartire da 7100, vedo che parte da 7200, quindi, continua a non tenermi conto i 100 secondi trascorsi...
    Questa non la ho capita... quando il timer arriva a 3.500... i secondi trascorsi sono 3.500 e non 100.... 100 sono i secondi CHE MANCANO.

    Quote Originariamente inviata da e444 Visualizza il messaggio
    L'unico dubbio che posso aver sbagliato la collocazione del "StartTime = Now"... perche non ho capito cosa intendi dicendo "all'inizio dell'evento timer".
    Intendi dire "prima" del comando "Timer.Start"?
    Quando viene eseguito il codice "Timer.Start" si genera l' EVENTO Timer.Elapsed (o altro, dipende dal timer che usi, immagino usi il timer di thread, che è il più leggero... ma comunque si genera un evento). Metti "StartTime = Now" all' inizio di quell' evento.

    Quote Originariamente inviata da e444 Visualizza il messaggio
    Comunque sia, l'ho collocato in vari punti... ergo... ho fatto varie prove ma... niente da fare... il tempo trascorso, non me lo calcola!...
    Non ho ben capito come esegui il nuovo calcolo del tempo trascorso e a cosa veramente serve calcolarlo (cambi il Timer.Interval??). Ma se hai inserito "-(Now-StartTime).TotalSeconds" nella formula come fa a non tenerne conto??

    Comunque PRIMA del calcolo prova a mettere un
    "Debug.Print(
    (Now-StartTime).TotalSeconds.ToString)" di controllo.


    Ultima modifica di eziogsv; 05-01-2018 a 03:44

  8. #8
    Utente di HTML.it L'avatar di e444
    Registrato dal
    Jan 2012
    Messaggi
    37
    Altra prova che ho fatto... mi ha portato a fare la seguente scoperta....

    Ho modificato la durata dell'estensione... da 3600 a solo 2000... udite udite... ok non calcolarmi i secondi trascorsi... ma la cosa veramente simpatica è che non è partito da 5600... ma sempre da 7200!!!.... il che lo trovo impossibile...

  9. #9
    Quote Originariamente inviata da e444 Visualizza il messaggio
    Altra prova che ho fatto... mi ha portato a fare la seguente scoperta....
    Ho modificato la durata dell'estensione... da 3600 a solo 2000... udite udite... ok non calcolarmi i secondi trascorsi... ma la cosa veramente simpatica è che non è partito da 5600... ma sempre da 7200!!!.... il che lo trovo impossibile...
    In programmazione gli errori "di VB" non esistono... se i conti non tornano c' è UN TUO ERRORE da qualche parte, sicuro come l' oro. E' evidente che il programma parte sempre da 3.600, per cui hai modificato a 2.000 un dato di cui il programma non tiene conto dall' altra parte.

    Dovresti rivedere TUTTE le righe di codice dove c' è un 3.600 e dove c' è il 2.000.

  10. #10
    Utente di HTML.it L'avatar di e444
    Registrato dal
    Jan 2012
    Messaggi
    37
    Eziogsv il timer parte da 3600 per arrivare a 0.
    Quando la label è uguale a "0" devo accadere una serie di eventi... ma questi non centrano con il mio problema.

    quindi... quando il timer è a 3500, sono trascorsi 100 secondi...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.