Newsgroup: it.comp.lang.visual-basic
Titolo: Barra di Avanzamento

Ciao ragazzi,
avrei un quesito da proporvi:
ho realizzato un applicazione in visual studio 2005 che ha il seguente
compito:
1. leggere un file xml di indirizzi;
2. leggere un file html contenente un formato;
3. inviare le mail agli indiridizzi letti dal file xml con il formato
letto dal file html.
Bene, fino qui non c'è nessun problema: il programma funziona!
"Allora che vuoi!!!" direte voi! :)
Aspettate! Il problema è questo:
*alla fine dell'invio di ogni singola email (vi è un ciclo per inviare
la stessa email a tutti gli indirizzi della lista), vado a impostere
un comando che aggiorna una casella di testo, per tenere il conto
delle email inviate e per dare, all'utente, l'impressione che il
programma che sta avanzando.
NONOSTANTE l'istruzione sia messa nel posto giusto, NON AVVIENE NULLA!
voglio dire: la casella di testo viene aggiornata SOLO ALLA FINE del
programma, quando tutte le email sono state inviate! Vi assicuro che
ci sono rimasto così -->  =:|
Com'è possibile che l'istruzione non venga eseguita in modo SINCRONO?
Dimentico qualcosa? devo *forzare* l'istruzione da programma?
Non incollo il codice per non essere pesante, però la situazione è
questa:
CICLO {
         "serie di istruzioni per l'invio di email"
         conta = conta + 1
         ISTRUZIONE CHE AGGIORNA LA CASELLA DI TESTO CON IL VALORE DI
CONTA
}
Non si vede la casella di testo che va avanti col contatore
(1,2,3,...) ma si vede SOLO a fine
programma il valore totale!
Aiutatemi!!!  =:O
Ciao!
Luca Paolucci

 programma il valore totale!
Fosse in VB6 č un problema "risolvibile" con un DoEvents.
Ovvero, piů o meno, la macchina non ha tempo di aggiornare la form, mentre
sta elaborando.
Con .NET forse un thread diverso o comunque non saprei...

Scriveva 
luca.i...@gmail.com
 mercoledì, 03/12/2008:

Ma tu in che punto dici al sistema operativo che può gestire l'evento 
di 'finestra modificata'?
Se non gli dici niente, lui può farlo solo al End Sub, ossia quando il 
controllo gli ritorna per gestire la coda degli eventi.
Volendo, puoi però forzarlo con un banale Refresh del singolo controllo 
o della form, oppure (ma con tutti i rischi del caso, perchè se in coda 
ci sono altri eventi, come una pressione di un commandbutton, questi 
vengono gestiti) con un DoEvents
Alberto
-- 
Il tempo e la pazienza possono più della forza o della rabbia

 Con .NET forse un thread diverso o comunque non saprei...
Ciao Andrea, grazie per la risposta.
DoEvents va benissimo, comunque funziona lo stesso con Refresh.
Grazie comunque, ho scoperto il problema di DoEvents e relative
"polemiche" :)
Ciao!
Luca

 Scriveva 
luca.ing.i...@gmail.com
 mercoledì, 03/12/2008:

Ciao Alberto,
in questo caso è più opportuno utilizzare il Refresh del controllo,
(tra l'altro è un concetto
che mi sembra anche "basilare", e che mi fa capire che è il caso di
studiare meglio le fondamenta
del linguaggio)
grazie dell'aiuto!
:)
Ripere dieci volte: "All'interno di una procedura o funziona, se vai
manipolare le proprietà
dei controlli della GUI DEVI dire al programma di "aggiornare" la
parte grafica con Refresh!"
:))
Grazie Alberto!
Luca

 studiare meglio le fondamenta del linguaggio)
Veramente, non è un discorso di VB, è un concetto di sistema operativo 
a finestre ed eventi, come Windows ma come praticamente qualunque 
sistema operativo grafico.
Alberto
-- 
Alessandro Bergonzoni: Il tempo vola e noi no. Strano sarebbe se noi 
volassimo e il tempo no, il cielo sarebbe pieno di uomini con 
l'orologio fermo.

 "polemiche" :)
Ricorda sempre che, se il tuo ciclo comporta parecchie iterazioni (a
spanne, dal migliaio in su), utilizzare Application.DoEvents oppure
<controllo>.Refresh ad ogni singolo "giro" può comportare un certo
overhead, a seconda dei numeri anche abbastanza evidente.
Data una form con un pulsante e un textbox, prova ad eseguire questo
codice, togliendo il commento a una sola delle 4 righe indicate, e
nota la differenza
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) _
   Handles Button1.Click
      Dim startD As Date
      Dim elapsed As TimeSpan
      Dim i As Long
      startD = Now
      For i = 0 To 10000
         TextBox1.Text = i.ToString
         'Application.DoEvents()
         'TextBox1.Refresh()
         'Me.Refresh()
         'If (i Mod 100) = 0 Then Me.Refresh() 'un refresh ogni 100
iterazioni
      Next
      elapsed = New TimeSpan(Now.Ticks - startD.Ticks)
      Debug.WriteLine("Elapsed (ms): " &
elapsed.TotalMilliseconds.ToString)
End Sub

 Alberto
Scusami, ma non ho capito: se ho una procedura e, in risposta ad un
evento,
voglio che compaia una scritta in una casella di testo, basta inserire
un'sitruzione del tipo NomeCasella.Text = "Addio mondo crudele!" nella
procedura che gestisce l'evento stesso, senza la necessità di alcun
Refresh.
Diversamente, se voglio disegnare un cerchio su un pannello, allora è
necessaria
un'istruzione che dica di "ridipingere" la GUI, in modo da poter
vedere
il cerchio appena fatto (lo stesso accade se voglio cambiare il colore
dello sfondo).
Almeno in Java accade così.
Io pensavo (sbagliando) che, durante un ciclo interno del programma,
in cui
questo eseue dei calcoli (magari i più disparati, come il calcolo del
tasso
d'interesse delle azioni Alitalia se fosse licenziato il pilota
durante la fase
di atterraggio di un Boeing 747 a Caracas), istruzioni del tipo:
CasellaDiTesto.Text = "Mondo Crudele c'ho ripensato!"
Non avessero necessità del Refresh della GUI.
Ciao
Luca


Grazie Luca, sei stato molto chiaro. Riporto per intero la tua
procedura che
è molto istruttiva.
Ciao!
Luca

 Non avessero necessità del Refresh della GUI.
Il refresh deve ovviamente esserci, questo è un requisito del sistema 
operativo. Se poi qualche linguaggio si arroga il diritto di invocare 
il sistema operativo ad ogni .text="ciao", anzichè rilasciare il 
controllo a fine elaborazione, è una scelta.
Ciao
Alberto
-- 
Il tuo stesso identico umore,
ma la divisa di un altro colore

 ma la divisa di un altro colore- Nascondi testo citato
Queste due righe, se non sbaglio, dovrebbero essere state tratte da
una bellissima
canzone di De Andrè
:)
Ciao

 :)
La guerra di Piero.
:)
ciao
stefano