Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2025
    Messaggi
    2

    [VB6] Problema con Timer. non si verifica Tick

    Buongiorno.
    Questa è la mia prima discussione sul forum e spero di non essermi sbagliato. Non ho trovato una sezione per presentarsi e nel caso servisse lo faccio senza problemi.

    Ho un problema con il funzionamento del Timer su VB6.
    Il mio programma comunica con un dispositivo esterno che ho creato io e la comunicazione funziona. Lo trova e "dialoga" scambiandosi dati correttamente. Ogni tanto esce un errore ma quello credo sia un BUG che ho trovato. Quello che vorrei ottenere con il Timer è che se il dispositivo non comunica più per un tempo superiore di 6 secondi mi esca un messaggio e chiuda la comunicazione (o provi a ricontattare il dispositivo). Al momento ho scritto questo per gestire questa cosa:

    codice:
    Sub setta_seriale() 'nella sub che cerca il dispositivo, se lo trova, faccio partire il Timer1'
      Call InizioTimer()
    end sub
    
    Sub Invio_dati()
      RemoveHandler SP1.DataReceived, AddressOf SP1_DataReceived 'arrivo da una sub che intercetta la comunicazione sulla porta, lo tolgo altrimenti a ogni risposta del dispositivo ripartirebbe da zero'
      com_attiva = False
     'qui ci sono altre istruzioni ma sono solo per "dialogare" con il dispositivo e non credo servano'
    
     Try
      Do Dim Incoming As String = SP1.ReadLine()
       If Incoming <> "" Then
        returnStr = Incoming
       End If
      Loop
    
     Catch When returnStr <> ""
    
     Catch ex As Exception
    
     End Try
    
     If returnStr = (ritorno & Chr(13)) Then
      com_attiva = True
      Call ResetTimer()
     End If
    
     AddHandler SP1.DataReceived, AddressOf SP1_DataReceived 'riattivo l'intercettazione dei dati dalla porta di comunicazione
    
    End Sub
    
    '**********************************GESTIONE TIMER TEMPO MASSIMO SERIALE**********************************'
    Private Sub InizioTimer()
     MsgBox("inizio timer")
     Timer1.Interval = 6000
     Timer1.Enabled = True
    End Sub
    
    Private Sub ResetTimer()
     MsgBox("reset timer")
     Timer1.Enabled = False
     Timer1.Enabled = True
    End Sub
    
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
     MsgBox("fine timer")
     If com_attiva = False Then
      MsgBox("fine")
     ElseIf com_attiva = True
      MsgBox("fine2")
      Timer1.Enabled = False
     End If
    End Sub
     '********************************FINE GESTIONE TIMER TEMPO MASSIMO SERIALE********************************
    Ma non si comporta come vorrei.
    In pratica se faccio smettere di comunicare nei primi 6 secondi il dispositivo il programma su VB6 si comporta correttamente. Le volte dopo no ma entro correttamente nella sub ResetTimer() ogni volta che finisco il ciclo di comunicazione del dispositivo e quando faccio smettere la comunicazione esternamente (resetto il PIC o stacco USB) e clicco su un tasto di VB6 (con scritto 'disconnetti' che dovrebbe chiudere la comunicazione nel modo corretto) ho messo un msgbox(timer1.enabled) che mi mostra che il timer1 è abilitato ma non succede nulla (e rimane bloccato perchè non riceve risposta dal dispositivo che ha accettato il comando di chiusura comunicazione).
    Anche se aspetto molto tempo (so che il timer1 di VB6 non è preciso al millisecondo e dipende molto da che lavoro stà facendo il PC ma non mi serve questa precisione).

    La mia conoscenza di VB6 è scolastica e aumentata nel tempo ma sempre come autodidatta e non so tutto e credo sia un mio errore da qualche parte ma non capisco dove. Peccato il dover passare ad altro linguaggio non essendo più supportato.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,459
    Quote Originariamente inviata da Gime76 Visualizza il messaggio
    Ho un problema con il funzionamento del Timer su VB6. [...]
    Sia il codice sia la problematica è un pochino farraginosa per esaminarla nel dettaglio.

    Quello che si può dire riguardo il Timer è fare attenzione al fatto che questo linguaggio - ma l'uso del Timer in generale - non supporta una esecuzione "asincrona".

    Mi spiego: abilitare e disabilitare il timer serve solo a dire a Windows di mandare (o non mandare più) il messaggio relativo al "tick". La temporizzazione è relativa all'invio del messaggio, ma se ad esempio si imposta un tick ogni 6 secondi e la procedura ne impiega 10 a ultimare il suo compito, i messaggi relativi ai tick dopo 6 secondi arrivano, ma verranno gestiti tutti assieme dopo il termine dell'evento che ha richiesto i 10 secondi.

    In definitiva, c'è una coda: quando il timer è abilitato, ogni X secondi arriva un messaggio in coda per scatenare il timer. Se il programma è impegnato a "fare cose", legate o meno al timer, i messaggi si accumulano e quando l'operazione corrente terminerà il suo compito, il programma gestirà tutti i messaggi giunti fino a quel momento che sono in coda.

    Questo per dire che temporizzare col Timer non è una buona idea: è meglio usare un Timer più stringente, lasciare il suo evento libero da cose bloccanti (tipo una MsgBox, ad esempio) e verificare il tempo trascorso usando una sottrazione tra l'orario attuale e l'intervallo considerato, in breve cambiare la logica da "faccio cose ogni X tempo" al "controllo ogni X tempo, e faccio cose solo se è trascorso Y".

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

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

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,459
    Quote Originariamente inviata da Gime76 Visualizza il messaggio
    Ho un problema con il funzionamento del Timer su VB6. [...]
    Sia il codice sia la problematica è un pochino farraginosa per esaminarla nel dettaglio.

    Quello che si può dire riguardo il Timer è fare attenzione al fatto che questo linguaggio - ma l'uso del Timer in generale - non supporta una esecuzione "asincrona".

    Mi spiego: abilitare e disabilitare il timer serve solo a dire a Windows di mandare (o non mandare più) il messaggio relativo al "tick". La temporizzazione è relativa all'invio del messaggio, ma se ad esempio si imposta un tick ogni 6 secondi e la procedura ne impiega 10 a ultimare il suo compito, i messaggi relativi ai tick dopo 6 secondi arrivano, ma verranno gestiti tutti assieme dopo il termine dell'evento che ha richiesto i 10 secondi.

    In definitiva, c'è una coda: quando il timer è abilitato, ogni X secondi arriva un messaggio in coda per scatenare il timer. Se il programma è impegnato a "fare cose", legate o meno al timer, i messaggi si accumulano e quando l'operazione corrente terminerà il suo compito, il programma gestirà tutti i messaggi giunti fino a quel momento che sono in coda.

    Questo per dire che temporizzare col Timer non è una buona idea: è meglio usare un Timer più stringente, lasciare il suo evento libero da cose bloccanti (tipo una MsgBox, ad esempio) e verificare il tempo trascorso usando una sottrazione tra l'orario attuale e l'intervallo considerato, in breve cambiare la logica da "faccio cose ogni X tempo" al "controllo ogni X tempo, e faccio cose solo se è trascorso Y".

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

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

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2025
    Messaggi
    2
    Grazie per la risposta.

    Ho visto che era complesso trovare una soluzione con i dati che ho messo.

    è meglio usare un Timer più stringente, lasciare il suo evento libero da cose bloccanti (tipo una MsgBox, ad esempio) e verificare il tempo trascorso usando una sottrazione tra l'orario attuale e l'intervallo considerato, in breve cambiare la logica da "faccio cose ogni X tempo" al "controllo ogni X tempo, e faccio cose solo se è trascorso Y"
    Quello del tempo ho provato a usarlo ma non riesco a leggere l'ora. E' un sistema che uso quando mi servono ritardi sui PIC (più semplicemente con device come ARDUINO la funzione millis()). Ma con VB6 ancora non ho trovato il modo. Stò provando ad adattare quello che ho trovato in questa discussione:

    https://forum.html.it/forum/showthre...hreadid=825848

    Ma ancora non sono riuscito a ottenere quello che vorrei.

    L'idea era:
    1. leggere il tempo
    2. salvarlo in una variabile
    3. aggiornarlo a ogni ciclo quando finivo la comunicazione con il dispositivo
    4. controllare se passavano almeno 6 secondi (o anche un tempo diverso, la comunicazione con il dispositivo e ciclica ogni 1,5 secondi circa e il tempo di comunicazione è quello di mandare 15/20 variabili su seriale e quindi non supero il tempo massimo)
    5. eventualmente far uscire l'errore.


    Il timer di VB6 lo usavo per farlo funzionare "nascosto". A differenza dei PIC che faccio controlli a ogni ciclo (anche migliaia al secondo).

    Con il Timer1 di VB6 potrei svincolarlo dalla comunicazione, mettere un tempo molto lungo e a ogni tick controllare ma c'è sempre la scocciatura che ogni tanto (non riuscendo a sincronizzare i 2 timer) esca fuori l'allarme lo stesso.

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.