Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263

    VB:NET Timer irregolare rispetto all'orologio di sistema

    Ho inserito un Timer in un Form per comunicare agli utilizzatori quanto tempo occorre per importare dati da un DB che raggiungo tramite un driver ODBC. Devo importare numerose Tabelle delle quali non conosco la dimensione (Righe) e siccome il processo occupa un tempo ragguardevole mi è stato chiesto appunto di inserire un Timer. Nel processo ho inserito anche una Progressbar e per impostarne il valore ho rilevato tramite una Query il numero di righe di ogni Tabella che devo importare. Durante l'esecuzione di queste Query, specialmente se le righe sono molte, il Timer si ferma e perde anche molti secondi rispetto al tempo di sistema.
    Esiste un modo per obbligare il Timer a non "perdere il tempo"?
    Di seguito il codice di una Query e dell'impostazione del Timer.

    codice:
            Dim rs As New ADODB.Recordset()
            Dim sSQL As String
            Dim M As Integer
    
    
            ProgressBar.Value = 1000
            Application.DoEvents()
    
    
            sSQL = "SELECT Count(sconto) From ScontoClienti WHERE categoria=1"
    
    
            rs.Open(sSQL, CnODBC, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    
    
            M = rs(0).Value  
    
            ' M è il valore che utilizzo per gestire la ProgressBar durante la importazione delle Tabelle che avviene ricorsivamente tramite:
    
            DoUntil rs.EOF
            ......................
            Loop
    
            'Questo il Timer:
    
        Private S As Short
        Private N As Short
    
            Private Sub TimerTempoTrascorso_Tick(sender As Object, e As EventArgs) Handles TimerTempoTrascorso.Tick
    
            Dim Secondi As String, Minuti As String, TempoTrascorso As String
    
    
            S += 1
            N += 1
    
    
            Minuti = Int(N / 60)
    
    
            If N > 59 Then
                S = N - Minuti * 60
            End If
    
    
            If S < 10 Then
                Secondi = ":0" & S
            Else
                Secondi = ":" & S
            End If
    
    
            If Minuti < 60 Then
                TempoTrascorso = "0" & Minuti
            Else
                TempoTrascorso = Minuti
            End If
    
    
            TempoImport.Text = TempoTrascorso & Secondi
    
    
            End Sub

    Grazie per qualsiasi suggerimento; di fatto sto passando adesso da VB6 a VB.NET e qualche problema lo sto incontrando.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nel ciclo do..loop inserisci una

    Application.DoEvents()
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,286
    Fai una cosa del genere:
    codice:
    Dim mDataAttuale as datetime = DateTime.Now
    
    private evento TICK
    
        pippo.text = DateDiff( dateinterval.Second,DateTime.Now, mDataAttuale)
    end private

  4. #4
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Grazie Oregon, ma non è quando esegue il do...loop che si ferma, bensì quando esegue la Query "SELECT Count(sconto).....".
    Credo sia proprio la chiamata a queste Query che arresta la procedura; infatti la cosa è decisamente più sensibile per le Tabelle che so essere molto lunghe. Probabilmente fare il conteggio dei Records occupa spazio di memoria o qualcosa di simile e il Timer si ferma.
    In ogni caso avevo già inserito Application.DoEvents in tutti i cli do...loop.

  5. #5
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Grazie URANIO. Appena ho un attimo provo e poi posto il risultato.

  6. #6
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Ho seguito il suggerimento di URANIO ed effettivamente non c'è più la perdita complessiva di secondi che avevo prima. Purtroppo però rimane il fenomeno di arresto (visibile) del conteggio che poi si rimette "in pari" quando riprende. Credo dipenda proprio dalla Query che conta i records delle Tabelle, ma aspetto il parere degli esperti.
    Ancora grazie.

  7. #7
    Stai usando un System.Windows.Forms.Timer.

    Prova un System.Timers.Timer oppure un System.Threading.Timer​.

    http://www.abhisheksur.com/2011/03/a...omparison.html
    https://msdn.microsoft.com/en-us/lib...or=-2147217396
    Ultima modifica di eziogsv; 30-09-2016 a 18:32

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Si ferma perché la query viene eseguita in modo sincrono e all'interno dell'unico thread che si occupa anche della visualizzazione del valore. Qui il DoEvents non ti può aiutare e l'unico modo è usare un thread diverso (vedi suggerimento sui Timer su thread diversi).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Grazie a tutti. Provo e vi dico.

  10. #10
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Sto cercando di adottare le soluzioni indicate sia da eziogsv che da oregon ma confesso di non avere capito come fare.
    Ho provato ad istanziare un nuovo Namespace, (sia System.Timers.Time che System.Threading.Timer​) nello spazio apposito della Class Form1 con la quale sto lavorando ma il sistema mi comunica che l'istruzione Imports non è necesaria. D'altra parte io il Timer lo devo utilizzare dentro a questa Form.
    Forse mi ci vorrebbe un esempietto, ....

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.