locked
Valutare la percentuale di avanzamento dell'esecuzione di un File RRS feed

  • Domanda

  • Chiedo scusa se ho sbagliato il Forum, ma non so districarmi con le definizioni che proponete.

    Ho inserito in un Progetto VB Net una "Progressbar" che dovrebbe avanzare in relazione all'avanzamento dell'esecuzione dei File. I File da valutare sono genericamente iterazioni di Query da Tabelle e la soluzione potrebbe essere quella che espongo sinteticamente:

                rsP.MoveFirst()
    
                Do Until rsP.EOF
                    '******************************
                    ProgressBarImport.PerformStep()
                    '******************************
                    rsTipologie.AddNew()
                    rsTipologie("Cli_Fo").Value = Trim(rsP("tip_cli_for").Value)
                    rsTipologie("CodTp").Value = Trim(rsP("tip_cod").Value)
                    rsTipologie("Tipologia").Value = Trim(rsP("tip_des").Value)
                    rsTipologie.Update()
                    rsPicam.MoveNext()
                Loop

    Se però io imponessi banalmente di Eseguire un Query, magari con tempi lunghi di esecuzione perché la Tabella di origine è molto lunga, come faccio a valutare la progressione? Credo che comunque ci sia da tenere in considerazione anche il tipo di PC su cui il programma viene eseguito, e qui, .....

    Nel contempo, vorrei anche esprimere accanto alla ProgressBar, il valore Percentuale di avanzamento. Questo valore come lo ricavo?

    Più genericamente mi piacerebbe comunque conoscere quali sono i metodi utilizzati dai professionisti del settore per la visualizzazione del progresso di esecuzione dei file

    lunedì 9 dicembre 2019 15:18

Tutte le risposte

  • La percentuale la potresti calcolare come rapporto fra cicli fatti e quelli totali.
    mercoledì 11 dicembre 2019 08:38
  • Questa è sicuramente una possibilità, ma è ovviamente limitata alle procedure nelle quali esiste un "ciclo", come ad l'iterazione che ho indicato come esmpio di codice. Se però richiedo semplicemente l'esecuzione di una Query, come faccio a sapere quanti cicli eseguirà? Se si trattasse ad esempio di una Query di Aggiornamento, come faccio a conoscere il numero di campi che aggiornerà? e poi questi aggiornamenti sono da considerare cicli?

    Io non so se il Software (con la S maiuscola) contempla anche esecuzione di Query o se in esso vengono eseguiti calcoli o funzioni matematiche, però spesso vedo che viene visualizzata una barra di avanzamento con magari anche una percentuale. È il caso ad esempio dell'operazione usuale di copia e incolla di File o di cancellazione degli stessi: se ce ne sono molti, Windows visualizza una finestra con la barra di avanzamento e la percentuale (e molto altro ancora). Queste operazioni non credo siano esecuzioni di Query, ma evidentemente è possibile valutare in anticipo quanto tempo occorre per eseguirle.

    Questo mi piacerebbe sapere, magari anche solo a titolo informativo.

    giovedì 12 dicembre 2019 09:09
  • Il software che copia i file ha gioco facile nel predire il tempo rimanente. Conosce il numero dei file, potrebbe fare il rapporto tra quelli copiati ed il totale. Se invece vuole proprio fornire il tempo mancante, può calcolare la velocità di trasferimento dell'ultimo blocco di dati e data la quantità di byte rimanenti, stimare il tempo residuo di volta in volta.

    Con i database le operazioni dovrebbero essere più complesse e probabilmente come si legge in queste risposte:

    https://stackoverflow.com/questions/3289670/monitoring-the-progress-of-an-sql-query-in-sql-server

    https://stackoverflow.com/questions/10026059/sql-server-get-progress

    un modo standard per ottenere il tempo non c'è.

    Al più puoi vedere se leggendo informazioni da tabelle si sistema, riesci a ricavare i parametri che ti servono. Alcune tabelle utili sono riportate qui:

    https://dba.stackexchange.com/questions/63112/running-query-progress-indication

    A meno che non riesci a suddividere la tua query in sottoquery più brevi. In tal caso ad ogni passo, puoi fornire una stima basandoti anche sul tempo del passo precedente.




    • Modificato BlueLed giovedì 12 dicembre 2019 10:21
    giovedì 12 dicembre 2019 10:19
  • Grazie per l'esauriente risposta. Era una curiosità e me la sono tolta; continuerò ad utilizzare il sistema esposto all'inizio, in fondo non va così male.

    In tutto questo però ho "dimenticato" di specificare che non utilizzo BackgroundWorker nelle mie procedure (per pigrizia nel dover affrontare un argomento per me nuovo) e quindi la mia insoddisfazione nel vedere la ProgressBar inciampare spesso è dovuta al fatto che non calcolo il tempo in maniera asincrona.

    Questo perché non ho trovato un esempio facile , magari in italiano, per gestire l'esecuzione di Query e la Progressbar contemporaneamente con BackgroundWorker. Adesso cerco in questo Forum un esempio o, se non lo trovo, introdico un nuovo argomento (a meno che tu non abbia già una informazione in merito)

    Ancora grazie.

    venerdì 13 dicembre 2019 08:22
  • Qui c'è un esempio sull'uso del worker più ProgressBar

    http://www.java2s.com/Code/VB/GUI/BackgroundWorkerDemo.htm


    • Modificato BlueLed venerdì 13 dicembre 2019 10:20
    venerdì 13 dicembre 2019 10:19
  • Molte grazie. Sono riuscito "quasi" a capire come procedere, nel senso che ho fatto eseguire una mia procedura abbastanza lunga in modo asicrono e ad avere una ProgressBar fluida. Però adesso ho altri problemi, ossia:

    1 - di procedure da eseguire ne ho diverse e tutte in sequenza.

    2 - prima di ogni procedura dovrei modificare il testo di una Label che specifichi cosa sta accadendo. So che questo non si può fare da BackgroundWork.DoWork. Come posso fare? Ho provato a dare un'occhiata ai tutorial, ma non ho trovato esempi semplici (che non prevedessero di passare da Button). Io dovrei banalmente fare in modo che la Label riportasse "Procedura Uno" e poi la eseguisse; al termine "Procedura Due" e poi la eseguisse, ecc.

    Puoi aiutarmi?

    Grazie

    mercoledì 18 dicembre 2019 17:07
  • Per aggiornare la gui da un thread secondario puoi usare Invoke:

    https://medium.com/xster-tech/invoke-ui-changes-across-threads-on-vb-net-404d21498727

    giovedì 19 dicembre 2019 08:24
  • Grazie per il suggerimento. È quello che ho fatto. Bisogna solo avere tanta pazienza perché se devi aggiornare una Label 100 volte, devi scrivere 100  metodi.

    Buone Feste.

    giovedì 19 dicembre 2019 10:34