Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [Vb.Net] Problema sull'evento timer.tick

    Un saluto a tutti, ho un problema come da oggetto sull'evento scatenato dalla fine del conteggio di un timer, posto di seguito il codice:

    codice:
    'istanzio un nuovo timer
    Private timer As System.Windows.Forms.Timer = New System.Windows.Forms.Timer()
    
    'nel metodo load del form metto timer.Enabled = False
    
    'creo un metodo per indicare l'intervallo e per far partire il conteggio
    Private Sub HideProgress()
        'aggiungo l'ascoltatore sul timer
        AddHandler timer.Tick, Address of timer_end
        'setto l'intervallo a 1 minuto
        timer.Interval = 1000
        'abilito il timer
        timer.Enabled = True
        'avvio il conteggio
        timer.Start()
    End Sub
    
    'evento di fine conteggio
    Private Sub timer_end(ByVal sender As Object, ByVal e As EventHandler) Handles timer.Tick
        'in questo caso voglio nascondere una progress bar
        Progress.Visible = False
        'rimuovo l'ascoltatore
        RemoveHandler timer.Tick, Address of timer_end
        'disabilito il timer
        timer.Enabled = False
    End Sub
    Il problema è che chiamando HideProgress() a volte l'evento di fine conteggio viene chiamato 2 volte mentre altre non viene proprio chiamato...
    Quale potrebbe essere il problema secondo voi?

    Grazie in anticipo per le risposte

  2. #2
    Il problema è che aggiungi a run-time un gestore evento che punta alla routine timer_end
    AddHandler timer.Tick, Address of timer_end
    ma la stessa cosa la fai anche in fase di progettazione
    Private Sub timer_end(ByVal sender As Object, ByVal e As EventHandler) Handles timer.Tick
    Decidi .... o uno o l'altro.

    Facci sapere...
    Ciao

  3. #3
    Purtroppo da ancora problemi, ecco il codice usato:

    codice:
    'dichiaro una variabile di classe di tipo timer
    Private timerprogress As System.Windows.Forms.Timer
    
    Private Sub ResetProgress()
            'istanzio la variabile chiamata precedentemente
            timerprogress = New System.Windows.Forms.Timer()
            'imposto l'intervallo del timer a 1 minuto
            timerprogress.Interval = 1000
            'abilito il timer
            timerprogress.Enabled = True
            'faccio partire il conteggio
            timerprogress.Start()
            'questa è una richtext dove controllo che venga eseguita fino alla fine la sub
            rtb.AppendText("timer started" + Environment.NewLine)
        End Sub
    
    Private Sub timerp_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles timerprogress.Tick
            'fermo il conteggio
            sender.Stop()
            'nascondo la progressbar
            ProgressBar.Visible = False
            'disabilito il contatore
            sender.Enabled = False
            'questa sempre la richtext dove controllo che chiamato l'evento
            rtb.AppendText("progress removed" + Environment.NewLine)
        End Sub
    Dunque ora se chiamo una prima volta ResetProgress() tutto ok, la barra sparisce, mentre se la richiamo una seconda volta non chiama l'evento tick, poi se la chiamo una terza volta funziona tutto correttamente.... :master:
    Non so proprio il perchè prima va poi no e poi torna ad andare... eppure l'evento dovrebbe chiamarlo sempre invece vedo alla seconda volta che la sub dove inizia il conteggio viene eseguita ma non chiama l'evento..

  4. #4
    L'errore di funzionamento non è sicuramente nel codice che hai postato.

  5. #5
    Questo è il metodo che mi chiama ResetProgress(), se l'errore non è nemmeno qua dubito fortemente che sia da altre parti per ovvi motivi:

    codice:
    Private Sub Progress(ByVal n As Integer, ByVal str As String)
            _x = n
            'Set ProgressBar visible
            ProgressBar.Visible = True
            ' Set Minimum to 1 to represent the first file being copied.
            ProgressBar.Minimum = 1
            If str = "prova1" Then
                ' Set Maximum to the total number of files to copy.
                ProgressBar.Maximum = 16
            ElseIf str = "prova2" Then
                ProgressBar.Maximum = 1023
            ElseIf str = "prova3" Then
                ProgressBar.Maximum = _count
            End If
            ' Set the initial value of the ProgressBar.
            ProgressBar.Value = 1
            ' Set the Step property to a value of 1 to represent each file being copied.
            ProgressBar.Step = 1
    
            ProgressBar.Increment(Me._x)
            
            If str = "prova1" Then
                If (Me._x = 16) Then
                    ResetProgress()
                End If
            ElseIf str = "prova2" Then
                If (Me._x = 1023) Then
                    ResetProgress()
                End If
            ElseIf str = "prova3" Then
                If (Me._x = _count) Then
                    ResetProgress()
                End If
            End If
    Come vedi mi son dovuto creare un modo per capire se la barra ha finito il caricamento con un if e degli else if, ciò perchè non ho trovato nessun evento associato alla progressbar che lo indichi. Sono comunque sicuro che tutti e tre chiamano ResetProgress() perchè come hai visto precedentemente ho messo una richtext che mi mostra se viene chiamata la sub

  6. #6
    Così a prima vista sembra che il codice sia corretto(corretto è un parolone ... diciamo funzionante ) ... ma se spieghi bene quello che vuoi fare .... forse ci arriviamo in un modo più corretto e funzionale.
    Facci sapere....
    Ciao

  7. #7
    Va beh lasciamo stare la stesura del codice che è stata fatta in fretta per provare, comunque mettiamola così, devo ricevere una stringa tramite seriale, non ho possibilità di vedere quando è stata ricevuta tutta perchè non mi risulta che la classe serialport abbia un evento che gestisca questa cosa e in generale non posso sapere quando ricevo o non ricevo dati, quindi mi sono inventato una cosa del genere:

    codice:
    Private Sub ricevi(ByVal str As String)
    
    _string += str
    
    Progress(_string.Length,prova1)
    
    End Sub
    questo metodo viene chiamato dall'evento data_received della serialport

  8. #8
    Nessun suggerimento?
    Ho anche provato ad istanziare un altro timer solo nel caso di prova 2 per escludere il fatto che il primo timer fosse impegnato ma nulla, l'evento tick non viene chiamato. Può darsi che sia un problema di thred nel caso in cui si stia ancora ricevendo dati dalla seriale quando il timer parte? Non so
    proprio che altro pensare e da come ho letto il timer lavora sullo stesso thread del form dal quale viene lanciato.

    Grazie di nuovo per il vostro aiuto

  9. #9
    Dunque ho fatto girare l'app in debug e ho visto cosa non va, ho 2 classi una che è quella del form e un'altra che gestisce la connessione seriale quindi quando ricevo un dato la classe della seriale chiama la Sub ricevi del form e quest'ultima fa partire il timer, però finito ciò l'esecuzione si sposta alla fine della metodo ricevi della classe della seriale in attesa di dati quindi suppongo che essendo su un altra classe anche se il timer termina il form non sente l'evento. Come posso fare per risolvere questa cosa? ho provato a passare il timer alla classe della seriale ma nulla...

    Grazie

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