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 :

Thread et Winform


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    Par défaut Thread et Winform
    Bonjour,

    je travaille sur un programme de type Winform, avec le framework 3.5.
    J'ai donc une form principale, avec des boutons et tout un tas de choses.
    Ensuite, j'ai un thread independant qui recolte des informations (bdd et reseau).
    Et je voudrais que ce thread puisse manipuler l'apparence de ma form principale.

    Prenons un exemple concret (en vrai ce n'est pas comme cela, mais c'est un exemple minimal pour montrer le probleme):
    la form possede un bouton: button1. Lorsqu'on clique sur ce bouton, ca va lancer le thread. Et lorsque le thread demarre, la premiere chose qu'il fait c'est de chacher (hide) ce bouton.
    Pour ce faire, j'ai essaye le code suivant:

    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
    35
    36
    //mainform.cs
    public partial class MainForm : Form
    {
        // le code de la main form
     
         private void button1_Click(object sender, EventArgs e)
         {
             ExecuteThread ct = new ExecuteThread(this);
             Thread oThread = new Thread(new ThreadStart(ct.Execute));
             oThread.Start();
         }
     
        internal void HideButton1() 
        { 
            button1.Hide(); 
        }
    }
     
    // le code du thread:
    internal class ExecuteThread
    {
        private MainForm main_form;
        internal bool ended;
     
        internal ExecuteThread(MainForm mainform)
        {
            ended = false;
            main_form = mainform;
        }
     
        internal void Execute()
        {
            main_form.HideButton1();
            // ...
        }
    }
    Le probleme, c'est que le programme crashe sans aucun message d'erreur, sans passer par aucun catch, lors de l'appel a button1.Hide(); alors que button1 est ok (pas null et ses champs sont ok).

    Savez-vous ou est le probleme?

    ps: pardon pour les accents, mais je suis sur un clavier italien avec un os en anglais.

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    l'interface graphique est géré par le UIthread. Lorsque tu demandes à un Thread autre que le UIThread de modifier l'IHM, tu fais en fait une violation de domaine d'accès.

    En clair, il n'est pas autorisé qu'un thread modifie des éléments qui ne lui appartiennent pas.

    Le plus simple dans ce genre de situation est la suivante:

    Soit le thread "notifie" son créateur de changement d'état que celui ci doit répercuter, soit utiliser la propriété "InvokeRequired" (cherches exemples sur le net)...

    soit le créateur modifie, dans ton exemple, le bouton.

    Il faut que tu regardes du coté des Invoke, BackgroundWorker, InvokeRequired et en règle général, la séparation Thread et UIThread

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    Par défaut
    ok je vois, merci theMonz31

    j'ai fait quelques recherches selon tes conseils, et apparamment, le BackgroundWorker semble une onne solution; je vais essayer.

Discussions similaires

  1. thread et winform(débutant)
    Par eldrad95 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 08/01/2010, 15h42
  2. [MT] Thread et Winforms
    Par r0d dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/10/2007, 09h50
  3. Thread in Winform
    Par totom1982 dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 21/03/2007, 20h00
  4. Réponses: 2
    Dernier message: 18/07/2006, 12h20
  5. [VB.NET][WINFORMS] Multi threading
    Par joKED dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/02/2006, 11h48

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