Oppure

Loading
02/06/21 12:51
alip1
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
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 02/06/21 12:55
aaa
03/06/21 16:27
nessuno
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à.
04/06/21 9:38
alip1
Postato originariamente da nessuno:

Subito dopo aggiungi una

DoEvents


In effetti uso queste tre istruzioni
 Cursor.Current = Cursors.WaitCursor
 Application.UseWaitCursor = True
 Application.DoEvents()


Ma non cambia nulla...
Ho provato ad utilizzare anche
l'istruzione:
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 04/06/21 9:38
aaa
04/06/21 14:40
Lucios
Probabilmente non si aggiorna perchè l'operazione che stai facendo è bloccante.
Potresti provare a fare i tentativi di connessione in un thread differente.
04/06/21 16:02
Thejuster
Non so voi, ma in C# mi basta semplicemente fare


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.



    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



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.
mire.forumfree.it/ - Mire Engine
C# UI Designer
08/06/21 8:12
alip1
Postato originariamente da Thejuster:

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


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.



    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



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.
aaa
08/06/21 11:48
Carlo
Ciao, il codice C# di Thejuster funziona perfettamente, in VB.Net metti un bottone sul form ed esegui:
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 08/06/21 17:28
in programmazione tutto è permesso
15/06/21 7:34
alip1
Grazie a tutti
aaa