Oppure

Loading
26/01/11 15:47
Phil93
Salve a tutti. Esordisco in questa community con un problema su cui mi arrovello da tempo.

In pratica, con l'evento Click di un bottone, vado a crittare un'immagine contenuta in una ListView, con una StatusLabel che indica lo stato dell'operazione:

If Saver.ShowDialog = Windows.Forms.DialogResult.OK And Saver.FileName <> "" Then
            Try
                Status.Text = "Encrypting..."
                Encrypting.ImageCrypting.Crypt(Paths1(I), Saver.FileName)
                Status.Text = "File encrypted"
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End If


Il problema è che, prima di eseguire il metodo Crypt della classe ImageCrypting, non viene aggiornata la Label a "Encrypting...", ma rimane "Ready" per tutta la durata dell'operazione, per poi cambiare il suo testo in "File encrypted" finita l'esecutione di Crypt.

Lo stesso problema mi si presentava durante un ciclo for con un'istruzione all'interno che aggiornava il testo di una Label per indicare lo stato dell'operazione, esempio:

Label.Text = ""
For I As Integer = 0 to x
    Istruzione...
    Istruzione...
    Label.Text = "Cicli residui : " & (x - I).ToString
Next I


In questo caso, durante tutto il ciclo, il testo della label rimaneva "", per poi diventare "0" alla fine del ciclo.

Avete idea di quale sia il problema?
Grazie.
aaa
26/01/11 16:02
giovannibart91
Ciao! Il ciclo for che cripta i tuoi dati viene "caricato" direttamente sul thread della tua finestra principale
Ciò significa che tutti i messaggi di repaint della finestra vengono momentaneamente "sospesi" in attesa che il ciclo termini.

Per risolvere puoi provare ad aggiungere "Application.DoEvents" subito prima del Next del ciclo for, in modo da processare tutti gli eventi accodati
e per sicurezza prima di quella riga aggiungici anche un bel "Me.Refresh"che non può far male (forza il repaint della finestra principale e quindi anche della label) ;)
Ultima modifica effettuata da giovannibart91 26/01/11 16:03
aaa
26/01/11 16:07
Gianluca87
Esegui le tue operazioni di encriptazione su un thread separato.... puoi gestire i cambi di stato dell'interfaccia con degli eventi sul thread principale della tua applicazione
aaa
26/01/11 16:20
Phil93
Grazie mille a tutti! Ho risolto aggiungendo un Application.DoEvents subito prima della chiamata al metodo Crypt.
aaa