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

C# Discussion :

lancer un formulaire en arrière plan


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut lancer un formulaire en arrière plan
    Bonjour,

    J'ai un windows.form qui "observe" un objet et indique ses charactéristiques en temps réel (ce premeir formulaire tourne tous le temps, il a été lancé via un thread) . J'ai le formulaire principal (provenant du main processus) qui me permet de changer les charactéristiques du dit objet.

    Mais je ne peut pas faire ca car j'ai une erreur me disant que la modification du control à lieu avec un thread différent du thread qui l'a créé. Pour palier à ce problème je peut faire :
    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
    Mais ce la n'est pas très joli.

    En gros comment faire pour avoir plusieurs fomulaires qui tournent en meme temps et s'échangent des données ?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 27
    Points : 33
    Points
    33
    Par défaut
    Tu dois utiliser des délégués pour éviter les InValidCrossThreadExceptions.

    Tous les éléments du genre Form, Control et types hérités sont déssinés dans un thread d'affichage, et si tu veux modifier l'IHM (que cela soit une propriété Textbox.Text ou une BackgroundColor), tu dois le fare depuis le thread qui a créé le contrôle. Au lieu de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void Une_fonction(string toto)
            {
                this.maTextBox.text = toto;
            }
    , ce qui va renvoyer une erreur si le code est appelé depuis un thread différent, tu vas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void Une_fonction(string toto)
            {
                this.maTextBox.Invoke(new EventHandler(SetMaTextBoxText), toto, EventArgs.Empty);
            }
     
            private void SetMaTextBoxText(object toto, EventArgs e)
            {
                this.maTextBox.text = toto.ToString();
            }
    , ce qui va faire executer la méthode par le thread qui a créé le contrôle.

    Maintenant, ce qu'il faut voir aussi, c'est que ton problème vient peut-être d'une erreur de conception : il y a sûrement moyen de se passer de ce genre de bricolages, il faudrait voir ton projet dans son ensemble.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Ou tu peux aussi faire comme ceci (inspiré du MSDN)

    Au lieu de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void maFonction(String txt){
         txtField.Text = txt;
    }
    Tu fais :

    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
     
    delegate void maFonctionCallback(String txt);
     
    public void maFonction(String txt)
            {
                if (txtField.InvokeRequired)
                {
                    maFonctionCallback d = new maFonctionCallback(maFonction);
                    this.Invoke(d, new object[] { txt });
                }
                else
                {
                    txtField.Text = txt;
                }
            }
    C'est le principe du CallBack qui veut dire "quand ce champ est libre, appelle moi". On retrouve aussi ce principe dans les sockets (entre autres) avec BeginAccept(), ...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut
    Merci Ferdydurke et vito12345, le invoke est exactement ce qu'il me fallait. j'aavis vu ca sur msdn mais j'avais pas compris l'intéret et comment l'utiliser et en faite c'est tout simple :p

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

Discussions similaires

  1. comment lancer un programme en arrière plan
    Par metalica25 dans le forum Windows
    Réponses: 9
    Dernier message: 03/03/2013, 17h19
  2. [CLI] Lancer le script en arrière-plan
    Par ProgVal dans le forum Langage
    Réponses: 3
    Dernier message: 30/10/2009, 18h11
  3. comment lancer une fenètre en arrièr plan
    Par moon93 dans le forum wxPython
    Réponses: 2
    Dernier message: 16/07/2007, 09h25
  4. Lancer des processus en arrière plan
    Par momeftah dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 01/05/2007, 18h50
  5. Réponses: 19
    Dernier message: 27/04/2007, 15h25

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