
alip1 (Normal User)
Pro
    
Messaggi: 129
Iscritto: 12/08/2019
|
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 |
Application.UseWaitCursor = True
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 |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6345
Iscritto: 03/01/2010
|
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à. |
|

alip1 (Normal User)
Pro
    
Messaggi: 129
Iscritto: 12/08/2019
|
Postato originariamente da nessuno:
Subito dopo aggiungi una
DoEvents |
In effetti uso queste tre istruzioni
Codice sorgente - presumibilmente C# / VB.NET |
Cursor.Current = Cursors.WaitCursor
Application.UseWaitCursor = True
Application.DoEvents()
|
Ma non cambia nulla...
Ho provato ad utilizzare anche
l'istruzione:
Codice sorgente - presumibilmente Plain Text |
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 |
|

Lucios (Normal User)
Newbie
    
Messaggi: 12
Iscritto: 19/10/2020
|
Probabilmente non si aggiorna perchè l'operazione che stai facendo è bloccante.
Potresti provare a fare i tentativi di connessione in un thread differente.
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2268
Iscritto: 04/05/2008
|
Non so voi, ma in C# mi basta semplicemente fare
Codice sorgente - presumibilmente Plain Text |
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 |
Private trovato As Boolean = False Private Sub prova() Dim t As Thread = New Thread(AddressOf cerca) t.start() End Sub Private Sub cerca() Corsor = Corsors.Wait Invoke(New Action(Function() trovato = True End Function)) Cursor = Cursors.Arrow End Sub
|
Altrimenti il codice originale il C# che ho fatto come esempio è questo
Codice sorgente - presumibilmente C++ |
bool trovato = false; void prova() { Thread t = new Thread(cerca); t.start(); } void cerca() { Corsor = Corsors.Wait; //query SQL //ed eventuali ricerche. //Trovato l'elemento esempio imposto la variabile bool su true Invoke(new Action(delegate() { trovato = true; })); Cursor = Cursors.Arrow; }
|
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.
|
|

alip1 (Normal User)
Pro
    
Messaggi: 129
Iscritto: 12/08/2019
|
Postato originariamente da Thejuster:
Non so voi, ma in C# mi basta semplicemente fare
Codice sorgente - presumibilmente Plain Text |
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 |
Private trovato As Boolean = False Private Sub prova() Dim t As Thread = New Thread(AddressOf cerca) t.start() End Sub Private Sub cerca() Corsor = Corsors.Wait Invoke(New Action(Function() trovato = True End Function)) Cursor = Cursors.Arrow End Sub
|
Altrimenti il codice originale il C# che ho fatto come esempio è questo
Codice sorgente - presumibilmente C++ |
bool trovato = false; void prova() { Thread t = new Thread(cerca); t.start(); } void cerca() { Corsor = Corsors.Wait; //query SQL //ed eventuali ricerche. //Trovato l'elemento esempio imposto la variabile bool su true Invoke(new Action(delegate() { trovato = true; })); Cursor = Cursors.Arrow; }
|
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.
|
|
|

Carlo (Member)
Guru
    
Messaggi: 1222
Iscritto: 29/01/2018
|
Ciao, il codice C# di Thejuster funziona perfettamente, in VB.Net metti un bottone sul form ed esegui:
Codice sorgente - presumibilmente VB.NET |
Imports System.Threading Public Class Form1 Dim trovato As Boolean = False Dim t As New Thread(AddressOf cerca) Private Sub cerca() Invoke(New Action(Sub() Cursor = Cursors.WaitCursor End Sub)) 'codice bloccante For a = 1 To 30000 Dim b As Integer = a Invoke(New Action(Sub() Me.Text = b End Sub)) Next ' imposto la variabile bool su true, e ripristino il cursore Invoke(New Action(Sub() trovato = True Cursor = Cursors.Arrow End Sub)) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If t.ThreadState = ThreadState.WaitSleepJoin Then Me.Text = "In esecuzione" : Exit Sub t = New Thread(AddressOf cerca) t.Start() End Sub 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 |
|

alip1 (Normal User)
Pro
    
Messaggi: 129
Iscritto: 12/08/2019
|
Grazie a tutti
|
|