Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  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,288
    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
    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

  5. #5
    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...
    :-(

  6. #6
    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...

  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
    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.

  9. #9
    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...

  10. #10
    Utente di HTML.it L'avatar di e444
    Registrato dal
    Jan 2012
    Messaggi
    37
    allora... provo a spiegarmi così...

    57736703LkQ.jpg

    Per capirci...
    Questa è il form principale
    c'è una textbox dove si inserisce il nome di un candidato al colloquio
    c'è alla destra c'è una combobox per stabilire le ore di partenza del colloquio (da 1 a 4)
    c'è un ovalschape (pallino rosso) che è il pulsante di avvio del colloquio.
    Da notare sotto la label indicante i 3600 secondi ancora da avviare.
    Andando nella vista codice, il tutto è comandato dall'evento click sull'ovalshape.
    nelle dichiarazioni delle variabili troviamo questi parametri... oltre ad altri che servono ad altro...

    codice:
    Public Class FormColloqui
        Dim HH As Integer
        Dim LineaNumero As Integer
        Dim LineaPerPagina As Integer
        Dim I_Avvio As Integer
        Dim I_Conta As Integer
        Dim Records As String = My.Computer.FileSystem.CurrentDirectory + "\Dati\Colloqui-del-" & Format(Now, "dd-MM-yyyy") & ".dat"
        Dim Backup As String = ("C:\Dati_Colloqui_Backup") + "\Colloqui-del-" & Format(Now, "dd-MM-yyyy") & ".dat"
        Dim Durata As Integer = 3600
        Dim t1 As Integer = 3600 't1 corrisponde a 1 ora
        Dim t2 As Integer = 7200 't2 corrisponde a 2 ore
        Dim t3 As Integer = 10800 't3 corrisponde a 3 ore
        Dim t4 As Integer = 14400 't4 corrisponde a 4 ore
        Public contatore As Integer = 0
    Evento click sul pallino

    codice:
    Private Sub OSSala1Posto1_Click(sender As System.Object, e As System.EventArgs) Handles OSSala1Posto1.Click
            'evento click sul pallino ovalshape gestito da un select case
            'le casistiche cambiano in base al colore del pallino
            Select Case OSSala1Posto1.FillColor
                'se il pallino è ROSSO
                Case Color.Red
                    'verifica che sia inserito un nome nella textbox, in caso contrario
                    If TBSala1Posto1.Text = "" Then
                        'un messaggio avvisa che non ci sono nomi nella postazione
                        MsgBox("Nessun candidato è nella postazione 1.")
                        'esce dalla sub
                        Exit Sub
                    End If
                    'verifica che sia selezionata almeno una delle 4 opzioni di durata del colloquio
                    If CBSala1Posto1.Text = "" Then
                        'in caso contrario mostra messaggio di assenza ed esce dalla sub
                        MsgBox("Al candidato " & TBSala1Posto1.Text.ToUpper & " Non hai specificato la durata del colloquio.")
                        Exit Sub
                        'se tutto è ok allora...
                    Else
                        'colora il pallino di verde
                        OSSala1Posto1.FillColor = Color.Lime
                        'disabilita la textbox per non modificare o cancellare i dati
                        TBSala1Posto1.Enabled = False
                        'diabilita la combobox per non modificare o cancellare i dati
                        CBSala1Posto1.Enabled = False
                        'imposta la label "InizioS1P1" nel formato orario attuale nelle 24 ore.
                        InizioS1P1.Text = Format(Now, "HH:mm")
                        'avvia il Timer
                        TimerS1P1.Start()
                    End If
                    'se il pallino è GIALLO
                Case Color.Yellow
                    'colora il pallino di ROSSO
                    OSSala1Posto1.FillColor = Color.Red
                    'resetta lo sfondo della textbox
                    TBSala1Posto1.BackColor = SystemColors.Window
                    'abilita la textbox
                    TBSala1Posto1.Enabled = True
                    'abilita la combobox
                    CBSala1Posto1.Enabled = True
                    'cancella il nominativo nella textbox
                    TBSala1Posto1.Text = ""
                    'cancella la durata dalla combobox
                    CBSala1Posto1.Text = ""
                    'resetta la label "inizio" colloquio
                    InizioS1P1.Text = "00.00"
                    'resetta la laber "fine" colloquio
                    FineS1P1.Text = "00.00"
                    'se il pallino è VERDE
                Case Color.Lime
                    'rinomina la label2 nel FormScelta
                    FormScelta.Label2.Text = "S1P1"
                    'mostra il Form
                    FormScelta.ShowDialog()
                    'se il pallino è GRIGIO
                Case Color.Gray
                    'Mostra messaggio ed esci dalla sub
                    MsgBox("Questa postazione è disabilitata")
                    Exit Sub
            End Select
        End Sub
    Impostazione della Label del timer, cambia la label in base a quante ore l'utente dichiara di fare.

    codice:
     Public Sub CBSala1Posto1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles CBSala1Posto1.SelectedIndexChanged
            'se è selezionato l'item 0, la label sarà rinominata con il t1 che corrisponde a "3600".
            If CBSala1Posto1.SelectedIndex = "0" Then
                LBTimerS1P1.Text = t1
            End If
            'se è selezionato l'item 1, la label sarà rinominata con il t2 che corrisponde a "7200".
            If CBSala1Posto1.SelectedIndex = "1" Then
                LBTimerS1P1.Text = t2
            End If
            'se è selezionato l'item 2, la label sarà rinominata con il t3 che corrisponde a "10800".
            If CBSala1Posto1.SelectedIndex = "2" Then
                LBTimerS1P1.Text = t3
            End If
            'se è selezionato l'item 3, la label sarà rinominata con il t4 che corrisponde a "14400".
            If CBSala1Posto1.SelectedIndex = "3" Then
                LBTimerS1P1.Text = t4
            End If
        End Sub
    Gestione del Timer Tick

    codice:
    Private Sub TimerS1P1_Tick(sender As System.Object, e As System.EventArgs) Handles TimerS1P1.Tick
    
            'ad ogni 1000 millisecondi, scala il numero della label di "1"
            LBTimerS1P1.Text -= 1
    
            'quando la label è uguale a "0"...
            If LBTimerS1P1.Text = 0 Then
                OSSala1Posto1.FillColor = Color.Yellow
                TBSala1Posto1.BackColor = Color.Gold
                TimerS1P1.Stop()
                FineS1P1.Text = Format(Now, "HH:mm")
                Notifica.Show()
                contatore += 1
                ListView1.Items.Add(contatore)
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(TBSala1Posto1.Text)
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add("1")
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add("1")
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(CBSala1Posto1.Text)
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(InizioS1P1.Text)
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(FineS1P1.Text)
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(LBNote.Text)
                LBNote.Text = "n.n."
            End If
            If File.Exists(Records) = False Then
                Using CreaRecords As New StreamWriter(Records)
                    For CFR = 0 To ListView1.Items.Count - 1
                        CreaRecords.WriteLine(ListView1.Items(CFR).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR).SubItems(1).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR).SubItems(2).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR).SubItems(3).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR).SubItems(4).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR).SubItems(5).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR).SubItems(6).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR).SubItems(7).Text)
                    Next
                    CreaRecords.Close()
                End Using
            Else
                Using CreaRecords As New StreamWriter(Records)
                    For CFR2 = 0 To ListView1.Items.Count - 1
                        CreaRecords.WriteLine(ListView1.Items(CFR2).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR2).SubItems(1).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR2).SubItems(2).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR2).SubItems(3).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR2).SubItems(4).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR2).SubItems(5).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR2).SubItems(6).Text)
                        CreaRecords.WriteLine(ListView1.Items(CFR2).SubItems(7).Text)
                    Next
                    CreaRecords.Close()
                End Using
            End If
            If File.Exists(Backup) = False Then
                Using CreaBackup As New StreamWriter(Backup)
                    For CFR = 0 To ListView1.Items.Count - 1
                        CreaBackup.WriteLine(ListView1.Items(CFR).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR).SubItems(1).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR).SubItems(2).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR).SubItems(3).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR).SubItems(4).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR).SubItems(5).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR).SubItems(6).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR).SubItems(7).Text)
                    Next
                    CreaBackup.Close()
                End Using
            Else
                Using CreaBackup As New StreamWriter(Backup)
                    For CFR2 = 0 To ListView1.Items.Count - 1
                        CreaBackup.WriteLine(ListView1.Items(CFR2).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR2).SubItems(1).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR2).SubItems(2).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR2).SubItems(3).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR2).SubItems(4).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR2).SubItems(5).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR2).SubItems(6).Text)
                        CreaBackup.WriteLine(ListView1.Items(CFR2).SubItems(7).Text)
                    Next
                    CreaBackup.Close()
                End Using
            End If
        End Sub
    Immagini allegate Immagini allegate
    Ultima modifica di e444; 05-01-2018 a 04:58

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 © 2024 vBulletin Solutions, Inc. All rights reserved.