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

    [vb2010] Trovare un loop problematico

    Applicazione piuttosto complessa, con moltissime sub, molti loop di ricerca e controllo.

    A volte si verifica una qualche condizione per cui improvvisamente il programma inizia ad impegnare la CPU al 50% anziché all' 1% e non smette fino alla chiusura... evidentemente è entrato da qualche parte in un loop infinito, o qualcosa del genere.

    A questo punto la domanda è: VB.net mi offre la possibilità di trovare il punto problematico, mentre sono in Debug?

    Non posso mettere dappertutto dei Debug.Print di controllo: i loop sono decine e lavorano continuamente.... sarei sommerso di messaggi.

    Grazie per info

  2. #2
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Non ho idea sui "mezzi" di VS...però ho pensato ad una soluzione basata sul PerfomanceCounter...nella speranza che non sia una sega mentale...

    codice:
    Public Class Form1
    
        Dim PC_cpu_Usata As New PerformanceCounter
        Dim processo As Process
        Dim loop_attuale As String
        Dim log As String
    
        Private Sub Form1_Load() Handles MyBase.Load
            log = ""
            loop_attuale = ""
            processo = Process.GetCurrentProcess
    
            With PC_cpu_Usata
                .CategoryName = "processo"
                .CounterName = "% tempo processore"
                .InstanceName = processo.ProcessName
            End With
    
            Timer1.Interval = 500
            Timer1.Start()
        End Sub
    
        Private Sub Timer1_Tick() Handles Timer1.Tick
    
            If System.Math.Round(PC_cpu_Usata.NextValue, 0) > 40 Then
                log = log & loop_attuale & " - cpu= " & _
                    System.Math.Round(PC_cpu_Usata.NextValue, 0) & "%"  & vbCrLf
            End If
    
        End Sub
    End Class
    La pecca è che al posto di Debug.Print devi impostare la variabile "loop_attuale" per identificare il codice che stà "girando" e che impegna la cpu per più del 40%.
    Ho usato una String (log) per scrivere la traccia, vedi tu cosa ti è più comodo.
    Ciao

  3. #3
    Trovato! Era un If.. Then Goto che si verifica di rado, ma va (andava) in loop per un GoTo errato.

    Riguardo alla tua proposta, Vinsent, ti ringrazio ma non vedo a cosa serva: non dà indicazioni su DOVE avviene il Loop che mangia risorse. Cioè non dà un Form / Sub / Numero di riga.

    Inoltre il problema avviene (avveniva) RARAMENTE, solo se si verificano determinate condizioni... se metto il codice in un Form_Load non vedo nulla nel 99.999999% dei casi...

  4. #4
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Si vede che ho spiegato male ed ho dato per scontato qualche cosa...comunque è solo un' esempio di un' idea che penso non hai compreso.
    Il codice nel Load, che può essere qualsiasi sub a discrezione, serve solamente ad impostare i parametri del PerformanceCounter e a far partire il Timer, il "lavoro" lo svolge quest' ultimo...ed in base alla condizione "CPU usata dal programma > di 40%" scrive la riga nella stringa "log".

    Riguardo alla tua proposta, Vinsent, ti ringrazio ma non vedo a cosa serva: non dà indicazioni su DOVE avviene il Loop che mangia risorse. Cioè non dà un Form / Sub / Numero di riga.

    Inoltre il problema avviene (avveniva) RARAMENTE, solo se si verificano determinate condizioni... se metto il codice in un Form_Load non vedo nulla nel 99.999999% dei casi...
    Il discorso del Load penso di averlo chiarito sopra...per identificare la routine che impegna la CPU per più del 40% ho usato la String "loop_attuale", che dovrebbe sostituire i tuoi "Debug.Print", il valore va impostato con un' identificativo della routine in esecuzione, esempio:
    codice:
        Private Sub fai_questo()
            loop_attuale = "fai_questo"
            'eccetera eccetera
        End Sub
    in questo modo se il codice eseguito all' interno della Sub impegna la CPU in base alla condizione sopra viene scritta la riga ad esempio:
    codice:
    fai_questo - cpu= "percentuale processore"
    In pratica, togliendo la condizione, potresti misurare la CPU utilizzata per ogni operazione del tuo programma.
    Spero che così si capisca meglio.
    Da qualche parte nel forum avevo letto che si sconsigliava l' uso di GoTo in .NET perchè è utilizzabile solo per compatibilità con il VB6 ed altri motivi che non ricordo...sono il classico programmatore della Domenica.....comunque l' importante è che hai risolto il problema.
    Ciao

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.