Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Il programma
Forum - C# / VB.NET - Il programma "salta" un'istruzione

Avatar
Phil93 (Normal User)
Pro


Messaggi: 85
Iscritto: 26/01/2011

Segnala al moderatore
Postato alle 16:47
Mercoledì, 26/01/2011
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:

Codice sorgente - presumibilmente VB.NET

  1. If Saver.ShowDialog = Windows.Forms.DialogResult.OK And Saver.FileName <> "" Then
  2.             Try
  3.                 Status.Text = "Encrypting..."
  4.                 Encrypting.ImageCrypting.Crypt(Paths1(I), Saver.FileName)
  5.                 Status.Text = "File encrypted"
  6.             Catch ex As Exception
  7.                 MsgBox(ex.ToString)
  8.             End Try
  9.         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:

Codice sorgente - presumibilmente VB.NET

  1. Label.Text = ""
  2. For I As Integer = 0 to x
  3.     Istruzione...
  4.     Istruzione...
  5.     Label.Text = "Cicli residui : " & (x - I).ToString
  6. 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.

PM Quote
Avatar
giovannibart91 (Member)
Pro


Messaggi: 64
Iscritto: 30/05/2008

Segnala al moderatore
Postato alle 17:02
Mercoledì, 26/01/2011
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 il 26/01/2011 alle 17:03
PM Quote
Avatar
Gianluca87 (Ex-Member)
Expert


Messaggi: 300
Iscritto: 16/11/2008

Segnala al moderatore
Postato alle 17:07
Mercoledì, 26/01/2011
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

PM Quote
Avatar
Phil93 (Normal User)
Pro


Messaggi: 85
Iscritto: 26/01/2011

Segnala al moderatore
Postato alle 17:20
Mercoledì, 26/01/2011
Grazie mille a tutti! Ho risolto aggiungendo un Application.DoEvents subito prima della chiamata al metodo Crypt.

PM Quote