Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET 2008] Evento Sleep in modo Asincrono??
Forum - C# / VB.NET - [VB.NET 2008] Evento Sleep in modo Asincrono??

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Molin Mauro (Member)
Rookie


Messaggi: 47
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:24
Giovedì, 06/08/2009
Ciao a tutti!
Vi espongo il mio problema:
Ho una label di "stato" e vorrei che l'utente fosse informato di ciò che avviene. Però se scrivo tutto su un'unico Sub ovviamente visualizza solo lo stato finale ("Operazione Completata"). La mia domanda è: c'è un modo per far "dormire" il codice però in modo asincrono? Questo risolverebbe il problema mettendolo dopo ogni cambiamento di testo della label?

Pensavo cira così:
Codice sorgente - presumibilmente C# / VB.NET

  1. 'codice stato 1
  2. Label1.Text = "STATO 1"
  3. 'codice x lo sleep del codice in asincrono
  4. 'codice stato 2
  5. Label1.Text = "STATO 2"



e via dicendo...

Ultima modifica effettuata da Molin Mauro il 06/08/2009 alle 14:26


PM Quote
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 14:29
Giovedì, 06/08/2009
Non è che io abbia capito benissimo, ma per quello che ho compreso, sbagli l'impostazione. Per variare la label insieme allo stato delle operazioni, non devi utilizzare nessuna pausa. Il cambio deve avvenire nel momento in cui inizia un'operazione. Ammettiamo che il seguente codice che posto appartenga ad un programma che prima scrive un file e poi lo cancella (non ha molto senso :D ma è per fare un esempio):
Codice sorgente - presumibilmente Plain Text

  1. lblStato.text="Sto creando il file"
  2. CreaFile()
  3. lblStato.text="Sto cancellando il file"
  4. CancellaFile()



Inoltre il metodo che avevi scelto non è affidabile, perchè la stessa operazione può richiedere tempi d'esecuzione diversi.

Se qualcosa non ti è chiaro, chiedi pure.

Ultima modifica effettuata da ruggy94 il 06/08/2009 alle 14:31


"Se vuoi che una funzione di un programma non venga mai trovata, descrivila nella documentazione"
PM Quote
Avatar
Molin Mauro (Member)
Rookie


Messaggi: 47
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:32
Giovedì, 06/08/2009
Testo quotato

Postato originariamente da ruggy94:

Non è che io abbia capito benissimo, ma per quello che ho compreso, sbagli l'impostazione. Per variare la label insieme allo stato delle operazioni, non devi utilizzare nessuna pausa. Il cambio deve avvenire nel momento in cui inizia un'operazione. Ammettiamo che il seguente codice che posto appartenga ad un programma che prima scrive un file e poi lo cancella (non ha molto senso :D ma è per fare un esempio):
Codice sorgente - presumibilmente Plain Text

  1. lblStato.text="Sto creando il file"
  2. CreaFile()
  3. lblStato.text="Sto cancellando il file"
  4. CancellaFile()



Inoltre il metodo che avevi scelto non è affidabile, perchè la stessa operazione può richiedere tempi d'esecuzione diversi.

Se qualcosa non ti è chiaro, chiedi pure.


Il problema è che così come dici tu se io devo fare per esempio 5 operazioni visualizzerebbe sulla label solo l'ultima operazione perche le operazioni che devo eseguire non sono asincrone.


PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 14:38
Giovedì, 06/08/2009
Non ci vedo nessun problema, se le operazioni sono eseguite velocemente ben venga, perchè devi rallentare la label? Non mi pare una buona strategia rallentare un operazione solo per far vedere all'utente che essa è stata eseguita. Quindi va benissimo il codice che stai usando adesso.


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM Quote
Avatar
Molin Mauro (Member)
Rookie


Messaggi: 47
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:41
Giovedì, 06/08/2009
Testo quotato

Postato originariamente da manvb.net:

Non ci vedo nessun problema, se le operazioni sono eseguite velocemente ben venga, perchè devi rallentare la label? Non mi pare una buona strategia rallentare un operazione solo per far vedere all'utente che essa è stata eseguita. Quindi va benissimo il codice che stai usando adesso.



ma io non pensavo di rallentarlo di tanto... magari 10ms giusto per dare il tempo alla label di aggiornarsi e poi cmq siccome alcune operazioni sono abbastanza lunghe (come lo scaricamento di un file da circa 20MB) non credo che 10ms all'utente gli cambino la vita!

Ultima modifica effettuata da Molin Mauro il 06/08/2009 alle 14:42


PM Quote
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 14:44
Giovedì, 06/08/2009
A me sembra comunque una scelta sbagliata, poi decidi tu, ma non vedo il motivo.
E poi (non vorrei cadere in errore e quindi dire stupidaggini) le operazioni Sincrone (come quelle che stai svolgendo tu) non sono eseguite una dopo l'altra? Quindi i processi non si "sovrappongono", e perciò dovesti vedere tutti gli stati, e non solo l'ultimo. Correggetemi se sbaglio :-|

Ultima modifica effettuata da ruggy94 il 06/08/2009 alle 14:46


"Se vuoi che una funzione di un programma non venga mai trovata, descrivila nella documentazione"
PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 14:45
Giovedì, 06/08/2009
Cosa significa "per dare il tempo alla label di aggiornarsi"? La label si aggiorna ogni volta che un operazione viene completata e con 10 ms l'occhio umano non la percepisce comunque.

Ultima modifica effettuata da manvb.net il 06/08/2009 alle 14:45


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM Quote
Avatar
Molin Mauro (Member)
Rookie


Messaggi: 47
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:49
Giovedì, 06/08/2009
Testo quotato

Postato originariamente da manvb.net:

Cosa significa "per dare il tempo alla label di aggiornarsi"? La label si aggiorna ogni volta che un operazione viene completata e con 10 ms l'occhio umano non la percepisce comunque.



forse nn mi sono spiegato bene...
pensavo tipo così.
Codice sorgente - presumibilmente Delphi

  1. Private Sub Operazioni()
  2. Operazione1()
  3. Label1.Text = "OPERAZIONE 1 Completa"
  4. 'il codice dorme x 10ms in modo asincrono
  5. 'la label si aggiorna da sola
  6. Operazione2()
  7. Label1.Text = "OPERAZIONE 2 Completa"
  8. 'il codice dorme x 10ms in modo asincrono
  9. 'la label si aggiorna da sola
  10. End Sub



e via dicendo...
il problema è che se il codice non dormisse x 10ms in modo asincrono allora la label non verrebbe cambiata di testo mentre il Sub "Operazioni" è in esecuzione ma solo quando esso è completato quindi non verrebbero visualizzati i vari passaggi nella label!


PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 14:50
Giovedì, 06/08/2009
Usa Application.DoEvents()

Sleep non centra niente, devi solo ordinare a windows di elaborare tutti i messaggi, cosi la finestra viene refreshata.

Ultima modifica effettuata da manvb.net il 06/08/2009 alle 14:52


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo