IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Control.Invoke() et InvokeRequired


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Par défaut Control.Invoke() et InvokeRequired
    Bonsoir,
    Je suis actuellement en train de développer une nouvelle aplication dans laquelle je mets en place un système de connexion à une base de donnée par l'intermédiaire d'Asynchronous Delegates (pas envie d'utiliser la classe Thread ni le BackgroundWorker).

    Mon FLogin (boîte de dialogue de connexion):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
            public delegate void LoginSuccessfulEventHandler(LoginSuccessfulEventArgs e);
            public event LoginSuccessfulEventHandler LoginSuccessful;
     
            private delegate SqlConnectionReport ConnectionDelegate(string uid, string pwd,
                string sqlserver, string dbname);
     
            private void ButtonLogin_Click(object sender, EventArgs e)
            {
                this.Enabled = false;
     
                string uid = this.TextBoxUsername.Text;
                string pwd = this.TextBoxPassword.Text;
                string sqlserver = this.TextBoxSqlServer.Text;
                string dbname = this.TextBoxDbName.Text;
     
                ConnectionDelegate Connection = new ConnectionDelegate(SqlHelper.Connection);
                Connection.BeginInvoke(uid, pwd, sqlserver, dbname, new AsyncCallback(ConnectionCallback), Connection);
            }
     
            private void ConnectionCallback(IAsyncResult AsyncResult)
            {
                ConnectionDelegate Connection = (ConnectionDelegate)AsyncResult.AsyncState;
                SqlConnectionReport SqlConnReport = Connection.EndInvoke(AsyncResult);
     
                if (SqlConnReport.ConnectionSuccessful == true)
                {
                    LoginSuccessful(new LoginSuccessfulEventArgs(null));
                }
                else
                {
                    LoginSuccessful(new LoginSuccessfulEventArgs(SqlConnReport.Message));
                }
            }
    LoginSuccessful s'exécute sur mon Form1, mais le problème n'est pas là.

    Une fois que la connexion est effectue (SqlConnReport.ConnectionSuccessful à true), ma boite de dialogue est censée disparaître (avec un Hide()).

    J'éxécute donc sur ma Form1 (qui a reçu le signal LoginSuccessful) un InvokeRequired pour savoir si oui ou non le code s'éxécute sur le Thread principal ou non.

    InvokeRequired renvoi true, donc je suis censé utilisé la méthode Invoke() pour effectuer mon Hide(). Toutefois, j'ai testé le code sans cet Invoke() et il fonctionne sans Exceptions, ni quoi que ce soit d'autre. Or, je pensais que l'on ne pouvait accèder à un composant crée par un Thread qu'à partir de ce Thread en personne, or ce n'est pas le cas. Á moins que je me sois trompé...

    En vous remerciant d'avance,

    Nadd

  2. #2
    Membre confirmé Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
            private void ConnectionCallback(IAsyncResult AsyncResult)
            {
                ConnectionDelegate Connection = (ConnectionDelegate)AsyncResult.AsyncState;
                SqlConnectionReport SqlConnReport = Connection.EndInvoke(AsyncResult);
     
                if (SqlConnReport.ConnectionSuccessful == true)
                {
                    if (this.InvokeRequired)
                    {
                        MessageBox.Show("Test");
                    }
                    TextBoxSqlServer.Text = "Test";
                    // LoginSuccessful(new LoginSuccessfulEventArgs(null));
                }
                else
                {
                    LoginSuccessful(new LoginSuccessfulEventArgs(SqlConnReport.Message));
                }
            }
    La boite de dialogue affiche bien "Test" et la propriété Text du composant TextBoxSqlServer (crée par un autre Thread que celui en cours d'éxécution) est bien modifié...

    Je suis quelque peu perdu

  3. #3
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Salut .

    il se peut que tu n'est pas toujours une exception dans le cas d'un CrossThreadInvoke ... De plus si tu travailles en 1.1 l'exception n'existe pas (c'est pas pour ça qu'il ne faut utiliser Invoke ).

    Sinon tu n'as pas tout simplement désactivé la vérification ?

  4. #4
    Membre confirmé Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Par défaut
    Merci beaucoup pour votre réponse !

    En effet, je viens de tester la valeur de "CheckForIllegalCrossThreadCalls" et le programme m'a returné un false et en initialisant cette valeur à true en début de programme, une exception est bien générée !

    Encore une fois merci,
    Et bonne journée!

    Nadd

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Invoke pour les controls dans un webform
    Par chouana dans le forum Débuter
    Réponses: 1
    Dernier message: 10/01/2015, 17h05
  2. Réponses: 8
    Dernier message: 11/04/2014, 09h44
  3. Détecter un appel à Control.Invoke bloquant
    Par momobjk dans le forum C#
    Réponses: 6
    Dernier message: 12/04/2012, 14h43
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. Rx Controls Gif animés
    Par toufou dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2002, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo