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 - Cursore di Attesa
Forum - C# / VB.NET - Cursore di Attesa

Avatar
alip1 (Normal User)
Pro


Messaggi: 102
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 14:51
Mercoledì, 02/06/2021
La mia app in partenza fa vari controlli in particolare controlla la stringa di connessione e se è valida (cioè si collega al Server Sql) altrimenti se non lo una form con quelli disponibili perché l'utente possa settare il server corretto ed il DB...
Ovviamente se la stringa è corretta l'applicazione si apre velocemente, mentre se la stringa non è corretta va alla ricerca del server sql disponibile,  ma  tale operazione richiede un po' di tempo per cui vorrei che nell'attesa all'utente venisse presentato il cursore che gira onde far capire che l'app sta girando.
Ho usato queste due istruzioni
Codice sorgente - presumibilmente C# / VB.NET

  1. Application.UseWaitCursor = True
  2. Cursor.Current = Cursors.WaitCursor


ma non funziona. Il cursore rimane una freccia per cui non si capisce se l'app stia girando o meno.

Qualcusa sa dirmi in questi casi come si fa?? Grazie e buona festa della Repubblica a tutti

Ultima modifica effettuata da alip1 il 02/06/2021 alle 14:55
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6206
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:27
Giovedì, 03/06/2021
Subito dopo aggiungi una

DoEvents


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 102
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 11:38
Venerdì, 04/06/2021
Testo quotato

Postato originariamente da nessuno:

Subito dopo aggiungi una

DoEvents



In effetti uso queste tre istruzioni
Codice sorgente - presumibilmente C# / VB.NET

  1. Cursor.Current = Cursors.WaitCursor
  2.  Application.UseWaitCursor = True
  3.  Application.DoEvents()



Ma non cambia nulla...
Ho provato ad utilizzare anche
l'istruzione:
Codice sorgente - presumibilmente Plain Text

  1. System.Windows.Forms.Cursor.Current = Cursors.Arrow



ma ugualmente non funziona.


Volevo precisare che tali istruzioni avvengono tutte nel modulo Main .. prima che venga presentato un form MDI di interfaccia...

Ultima modifica effettuata da alip1 il 04/06/2021 alle 11:38
PM Quote
Avatar
Lucios (Normal User)
Newbie


Messaggi: 12
Iscritto: 19/10/2020

Segnala al moderatore
Postato alle 16:40
Venerdì, 04/06/2021
Probabilmente non si aggiorna perchè l'operazione che stai facendo è bloccante.
Potresti provare a fare i tentativi di connessione in un thread differente.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2131
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:02
Venerdì, 04/06/2021
Non so voi, ma in C# mi basta semplicemente fare

Codice sorgente - presumibilmente Plain Text

  1. Cursor = Cursors.Wait;



Nb:

Per quello che cerchi di fare, funziona unicamente se crei un Thread parallelo.
Se sfrutti il Thread principale, l'applicazione rimane congelata, non mostrandoti un bel niente.


chiedo scusa in anticipo perché ho convertito online da c# a vb.net
perché sono proprio negato col vb.


Codice sorgente - presumibilmente VB.NET

  1. Private trovato As Boolean = False
  2.  
  3.     Private Sub prova()
  4.         Dim t As Thread = New Thread(AddressOf cerca)
  5.         t.start()
  6.     End Sub
  7.  
  8.     Private Sub cerca()
  9.         Corsor = Corsors.Wait
  10.         Invoke(New Action(Function()
  11.                               trovato = True
  12.                           End Function))
  13.         Cursor = Cursors.Arrow
  14.     End Sub




Altrimenti il codice originale il C# che ho fatto come esempio è questo

Codice sorgente - presumibilmente C++

  1. bool trovato = false;
  2.  
  3.  
  4. void prova()
  5. {
  6. Thread t = new Thread(cerca);
  7. t.start();
  8. }
  9.  
  10.  
  11.  
  12.  
  13. void cerca()
  14. {
  15.   Corsor = Corsors.Wait;
  16.  
  17.   //query SQL
  18.   //ed eventuali ricerche.
  19.  
  20.  //Trovato l'elemento esempio imposto la variabile bool su true
  21.  Invoke(new Action(delegate() { trovato = true; }));
  22.  
  23.  Cursor = Cursors.Arrow;
  24.  
  25. }



Non ho testato il codice ma in caso di un qualche errore di tipo CrossThreadException, includi
il cambio di cursore anche esso in un metodo Invoke.
Teoricamente dovrebbe funzionare.


PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 102
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 10:12
Martedì, 08/06/2021
Testo quotato

Postato originariamente da Thejuster:

Non so voi, ma in C# mi basta semplicemente fare

Codice sorgente - presumibilmente Plain Text

  1. Cursor = Cursors.Wait;



Nb:

Per quello che cerchi di fare, funziona unicamente se crei un Thread parallelo.
Se sfrutti il Thread principale, l'applicazione rimane congelata, non mostrandoti un bel niente.

Grazie
volevo solo chiederti (non avendo mai usato un tread..e un delegate) nel codice vb da te postato function() in cerca a cosa si riferisce?? dovrebbe esse il nome della funzione che dovrebbe fare un certo lavoro?? Grazie

chiedo scusa in anticipo perché ho convertito online da c# a vb.net
perché sono proprio negato col vb.


Codice sorgente - presumibilmente VB.NET

  1. Private trovato As Boolean = False
  2.  
  3.     Private Sub prova()
  4.         Dim t As Thread = New Thread(AddressOf cerca)
  5.         t.start()
  6.     End Sub
  7.  
  8.     Private Sub cerca()
  9.         Corsor = Corsors.Wait
  10.         Invoke(New Action(Function()
  11.                               trovato = True
  12.                           End Function))
  13.         Cursor = Cursors.Arrow
  14.     End Sub




Altrimenti il codice originale il C# che ho fatto come esempio è questo

Codice sorgente - presumibilmente C++

  1. bool trovato = false;
  2.  
  3.  
  4. void prova()
  5. {
  6. Thread t = new Thread(cerca);
  7. t.start();
  8. }
  9.  
  10.  
  11.  
  12.  
  13. void cerca()
  14. {
  15.   Corsor = Corsors.Wait;
  16.  
  17.   //query SQL
  18.   //ed eventuali ricerche.
  19.  
  20.  //Trovato l'elemento esempio imposto la variabile bool su true
  21.  Invoke(new Action(delegate() { trovato = true; }));
  22.  
  23.  Cursor = Cursors.Arrow;
  24.  
  25. }



Non ho testato il codice ma in caso di un qualche errore di tipo CrossThreadException, includi
il cambio di cursore anche esso in un metodo Invoke.
Teoricamente dovrebbe funzionare.


PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1032
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 13:48
Martedì, 08/06/2021
Ciao, il codice C# di Thejuster funziona perfettamente, in VB.Net metti un bottone sul form ed esegui:
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Threading
  2.  
  3. Public Class Form1
  4.     Dim trovato As Boolean = False
  5.     Dim t As New Thread(AddressOf cerca)
  6.  
  7.     Private Sub cerca()
  8.         Invoke(New Action(Sub()
  9.                               Cursor = Cursors.WaitCursor
  10.                           End Sub))
  11.  
  12.         'codice bloccante
  13.         For a = 1 To 30000
  14.             Dim b As Integer = a
  15.             Invoke(New Action(Sub()
  16.                                   Me.Text = b
  17.                               End Sub))
  18.         Next
  19.  
  20.         ' imposto la variabile bool su true, e ripristino il cursore
  21.         Invoke(New Action(Sub()
  22.                               trovato = True
  23.                               Cursor = Cursors.Arrow
  24.                           End Sub))
  25.     End Sub
  26.  
  27.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  28.         If t.ThreadState = ThreadState.WaitSleepJoin Then Me.Text = "In esecuzione" : Exit Sub
  29.         t = New Thread(AddressOf cerca)
  30.         t.Start()
  31.     End Sub
  32. End Class



Come dice Thejuster, non dovrebbe occorrere un nuovo thread per eseguire l'istruzione: Cursor = Cursors.WaitCursor, anche se poi si esegue un codice "bloccante"

Ultima modifica effettuata da Carlo il 08/06/2021 alle 19:28


in programmazione tutto è permesso
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 102
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 9:34
Martedì, 15/06/2021
Grazie a tutti

PM Quote