Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2018
    Messaggi
    11

    [VB.NET] Aggiornamento di ProgressBar usando BackgroundWorker

    Salve a tutti,
    dovrei inserire una barra di avanzamento in un programma che compie varie operazioni, so che devo utilizzare Background Worker, ma non riesco a capire come.

    lo so che l'argomento è stato gia trattato ma non riesco a capire come procedere.

    Grazie

  2. #2
    Utente di HTML.it L'avatar di patel
    Registrato dal
    Jan 2008
    Messaggi
    1,994
    cerca "vb.net progress bar"

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2018
    Messaggi
    11
    Ma è corretto utilizzare Background Worker?
    Patel grazie per la risposta, ma naturalmente ho gia cercato progress bar.

  4. #4

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Quote Originariamente inviata da BoBoPoP Visualizza il messaggio
    dovrei inserire una barra di avanzamento in un programma che compie varie operazioni, so che devo utilizzare Background Worker, ma non riesco a capire come.
    L'uso del BackgroundWorker è d'obbligo perché se l'operazione di lunga durata viene eseguita nel thread principale dell'applicazione, questa non può gestire gli altri messaggi che sono in arrivo nella coda fino a quando non ha terminato il lavoro, e quindi non vedresti la ProgressBar aggiornata fino al termine.

    Il BackgroundWorker ti consente di mantenere la tua applicazione "libera" di gestire tutti gli eventi (refresh, spostamento, click vari, ecc.) mentre l'operazione di lunga durata continua ad avanzare.

    Per sapere come usarlo, è sufficiente consultare la documentazione in linea, che contiene anche esempi calzanti.

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

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

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2018
    Messaggi
    11
    Grazie per le risposte, con il BackgroundWorker mi da errore un metodo che utilizzo, quindi ho pensato di ritornare sul mulithread.
    In multithread il programma svolge tutte le funzioni correttamente e la barra avanza a dovere.
    IL problema � che rimane bloccata la finestra della barra non potendo utilizzare il bottone di arresto, quindi devo aver fatto un errore nell'utilizzo dei multitread.
    Non riesco roprio a capire cosa sbaglio.

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Quote Originariamente inviata da BoBoPoP Visualizza il messaggio
    Grazie per le risposte, con il BackgroundWorker mi da errore un metodo che utilizzo, quindi ho pensato di ritornare sul mulithread.
    Il BackgroundWorker è a tutti gli effetti una implementazione multithread, quindi non è ben chiaro "dove" o "a cosa" sei tornato nello specifico.

    Quote Originariamente inviata da BoBoPoP Visualizza il messaggio
    In multithread il programma svolge tutte le funzioni correttamente e la barra avanza a dovere.
    IL problema � che rimane bloccata la finestra della barra non potendo utilizzare il bottone di arresto, quindi devo aver fatto un errore nell'utilizzo dei multitread.
    Non riesco roprio a capire cosa sbaglio.
    Senza poter vedere il codice, è difficile diagnosticare quale possa essere l'origine del problema.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2018
    Messaggi
    11
    Quote Originariamente inviata da alka Visualizza il messaggio
    Il BackgroundWorker è a tutti gli effetti una implementazione multithread, quindi non è ben chiaro "dove" o "a cosa" sei tornato nello specifico.
    Si intendo al multiTrhad classico


    Quote Originariamente inviata da alka Visualizza il messaggio
    Senza poter vedere il codice, è difficile diagnosticare quale possa essere l'origine del problema.
    non se è corretto quello che ho fatto a livello teorico.

    1. Click bottone
    2. viene lanciato il form della progress bar
    3. nel load della progress bar vine lanciato il nuovo thread "sub loading"
    4. nella "sub loading" attraverso dei delegati lancio le sub che svolgono le varie funzini: ad sempio incremento progress bar e le funzioni che mi servono per il codice.


    a livello teorico il processo che ho seguito è corretto?

    codice:
        Public Sub ProgressBar_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
    
            ProgressBar1.Minimum = 0
            ProgressBar1.Maximum = 10
    
    
            t = New Threading.Thread(AddressOf LoadingProgressBar)
            t.Start()
    
    
        End Sub
    Ultima modifica di BoBoPoP; 22-05-2019 a 12:20

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Quote Originariamente inviata da BoBoPoP Visualizza il messaggio
    Si intendo al multiTrhad classico
    Non ci sono varianti "moderne" o "classiche" del multithreading.


    Quote Originariamente inviata da BoBoPoP Visualizza il messaggio
    non se è corretto quello che ho fatto a livello teorico.

    1. Click bottone
    2. viene lanciato il form della progress bar
    3. nel load della progress bar vine lanciato il nuovo thread "sub loading"
    4. nella "sub loading" attraverso dei delegati lancio le sub che svolgono le varie funzini: ad sempio incremento progress bar e le funzioni che mi servono per il codice.


    a livello teorico il processo che ho seguito è corretto?
    Spiegato a parole potrebbe anche essere corretto, ma quello che conta è l'implementazione.
    Se chiami le funzioni di aggiornamento della Progress Bar e di elaborazione tutte sul thread esterno, quando sarà in esecuzione l'una si bloccherà l'altra, e viceversa. In pratica, così a prima vista, hai creato un thread esterno dove hai spostato i problemi che avevi sul primo thread principale.

    E' chiaro che senza codice, come già detto, non si può dire molto.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2018
    Messaggi
    11
    codice:
    Imports System.Threading
    
    Public Class Form1
        Dim t As Thread
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ProgressBar1.Minimum = 0
            ProgressBar1.Maximum = 1000
    
    
            t = New Threading.Thread(AddressOf LoadingProgressBar)
            t.Start()
        End Sub
    
    
        Private Sub LoadingProgressBar()
            Try
                Dim i As Integer
                Dim progress As Integer = 0
    
                For i = 0 To 1000
    
                    Me.Invoke(up, i)
                    Me.Invoke(updateStatus, i)
                    Me.Invoke(msg, i)
                    Thread.Sleep(1000)
                Next
    
    
                Me.Invoke(closeForm)
            Catch ex As ThreadAbortException
                Err.Clear()
                Me.Invoke(closeForm)
            End Try
        End Sub
    
        'Delegate method to allows other thread to update value of Progress Bar
        Private Delegate Sub updateProgress(ByVal val As Integer)
        Private up As New updateProgress(AddressOf UpdateValue)
    
        'Delegate method to allows other thread to close
        Private Delegate Sub closeMe()
        Private closeForm As New closeMe(AddressOf CloseSplash)
    
        'Delegate method to allows other thread to update text of Label Status
        Private Delegate Sub setStatus(ByVal status As Integer)
        Private updateStatus As New setStatus(AddressOf WriteLabel)
    
        Private Delegate Sub message(ByVal i As Integer)
        Private msg As New message(AddressOf messaggio)
    
    
    
        'UpdateValue method has been implemented to update value of progress Bar
        Private Sub UpdateValue(ByVal val As Integer)
            ProgressBar1.Value = val
        End Sub
    
        'WriteLabel
        Private Sub WriteLabel(ByVal text As String)
            lbl.Text = text
        End Sub
    
        Private Sub messaggio(i As Integer)
            MsgBox(i)
        End Sub
    
    
        'Close
        Private Sub CloseSplash()
            Me.Close()
        End Sub
    
    
        Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
            t.Abort()
        End Sub
    End Class

    Grazie a te le cose adesso sono piu chiare, questo è un estratto d'esempio.
    quando parte il MSGbox il trhead si blocca quindi non è possibile adortire da tasto, invece io vorrei avere la possibilità di abortirlo ugualmente cliccando il Button1
    Ultima modifica di BoBoPoP; 22-05-2019 a 14:46

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