Visualizzazione dei risultati da 1 a 8 su 8

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117
    Ciao Alka!
    Ti riporto un po di codice così da spiegarmi meglio (tenendo conto che possa aver sbagliato tutto però ).


    Questa è una normale funzione ricorsiva che userei per scansionare le cartelle/sottocartelle:

    codice:
       Private Sub ricorsione(ByVal _myFld As IO.DirectoryInfo)
            For Each subF As IO.DirectoryInfo In _myFld.GetDirectories
                ricorsione(subF)
            Next
            For Each f As IO.FileInfo In _myFld.GetFiles
               'agisco e manipolo i miei files
            Next
    
        End Sub
    richiamando la funzione e passando come argomento l'oggetto directoryInfo iniziale scansiona tutti file nelle sottocartelle.

    Io ho provato a richiamare tale funzione nel doWork del BGW:

    codice:
    Private Sub myBGW_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles myBGW.DoWork
            If myBGW.CancellationPending Then
                e.Cancel = True
            Else
                ricorsione(New IO.DirectoryInfo("C:\MiaCartella"))
            End If
    End Sub
    E per iniziare il processo chiamo uno start asincrono del BGW:

    codice:
    myBGW.RunWorkerAsync()
    Ora...così il codice viene eseguito ma non riesco a passare il "progresso" del lavoro all'evento ProgressChanged non avendo spazio di manovra sulla funzione (come farei se il loop fosse inserito nel DoWork stesso).

    Di conseguenza non riesco ad avere il risultato che voglio (ovvero in fase di scanning avere l'aggiornamento in una label o txtbox).

    Non so se sono stata chiara sul problema...ho sempre problemi a spiegarmi

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Ora...così il codice viene eseguito ma non riesco a passare il "progresso" del lavoro all'evento ProgressChanged non avendo spazio di manovra sulla funzione (come farei se il loop fosse inserito nel DoWork stesso).
    Per comunicare il progresso al worker, devi in qualche modo passare un riferimento al BackgroundWorker nella chiamata della tua funzione ricorsiva, aggiungendo un parametro di questo tipo, affinché la chiamata passi (opzionalmente) il valore anche alle chiamate ricorsive e in modo che la chiamata di primo livello ed eventualmente anche le seguenti possano accedere all'oggetto e comunicare in qualche modo il loro progresso, tenendo presente che ciascuna chiamata ha la visibilità del livello di ricorsività a cui è giunto (in breve, conosce solo il punto del lavoro in cui è arrivata per ciò che le compete), a meno di non passare alla funzione ricorsivamente anche altri parametri che permettano di avere un quadro complessivo del lavoro e di restituire così un "progresso" reale.

    Sintentizzando in due parole, la tua funzione ricorsiva deve essere "worker friendly": se vuoi visualizzare un progresso dell'elaborazione, la funzione deve consentire di passare un parametro (che può essere il BackgroundWorker, o anche una interface più generica fatta da te) affinché essa possa comunicare informazioni sull'avanzamento dei lavori; in caso contrario, la tua chiamata alla funzione è "atomica" e a nulla serve sapere che si tratta di una funzione ricorsiva: il risultato finale lo otterrai all'uscita della prima chiamata.

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

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

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