[Threads] Impossible depuis autre fonction

Résolu/Fermé
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 - 13 déc. 2012 à 15:17
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 - 18 déc. 2012 à 13:31
Bonjour à tous !

Sous Visual C# je tente d'exécuter une fonction automatiquement au lancement du programme.
Je lançais cette fonction manuellement (par clic sur un bouton), mais maintenant j'aimerais que, lorsque mon programme charge, l'application soit lancée automatiquement.

J'ai donc mis dans le main (enfin, mon "Form1") ma fonction:
public Form1()
        {
            InitializeComponent();
            creerListe();
        }


Malheureusement, ma fonction "creerListe()" qui se lançait parfaitement à l'appui sur bouton plante avec un problème de "InvalidOperationException" car "Opération inter-threads non valide : le contrôle '' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."

Or il ne s'agit que de redimensions d'un datagridview etc ... rien qui fait appel à quelconques données.

Et donc, là, je sèche ! J'ai essayé de faire un "thread" avec ce que j'ai trouvé sur internet et de lancer mon "creerListe()" par ce thread, j'ai la même erreur.

Merci beaucoup d'avance à ceux qui pourront m'aider !

Damien

6 réponses

L0ci Messages postés 110 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 9 janvier 2013 30
13 déc. 2012 à 15:36
Bonjour,

Le problème vient du fait que ton thread secondaire "creerListe()" essaie de modifier l'affichage, qui est géré par un autre thread.
Tu peux utiliser dans ton thread créerListe():
this.Invoke((MethodInvoker)delegate {
    //modifie les propriétés de ta liste
});
2
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
13 déc. 2012 à 15:46
Bonjour et merci,

Alors en fait je dois mettre mon "creerListe()" entre les accolades du this.invoke ?
Ou le contenu de mon creerListe() ?

Merci d'avance :
1
L0ci Messages postés 110 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 9 janvier 2013 30
13 déc. 2012 à 16:00
Dans ta fonction créer liste, chaque modification sur l'interface doit être mise entre ces accolades.
ex:
function creerListe(){
this.Invoke((MethodInvoker)delegate {
    label1.text = "modification de mon label";
});
}
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
13 déc. 2012 à 16:03
Okay !

Alors j'ai mis une ligne qui semblait poser problème:
Form.ActiveForm.Size = new System.Drawing.Size(dataGridView1.Width + 10, 1000);


dans les accolades, mais alors il me retourne une autre erreur:
Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas été créé.


(nâvré si j'ai l'air très néophyte, mais c'est carrément le cas :( )
0
L0ci Messages postés 110 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 9 janvier 2013 30
13 déc. 2012 à 16:19
Ça veut dire qu'il essaie de modifier l'interface avant qu'elle ai été générée. Essaies de mettre l'appel de ta fonction dans l'evènement Shown de ton form.
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
13 déc. 2012 à 16:30
Bon j'ai pas tout compris (surtout pas où trouver le Form1 Shown) mais j'essaierai demain de retour au boulot !

Merci je te tiens au courant !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
14 déc. 2012 à 10:06
Alors ! J'ai fait des recherches là dessus, je vois que ça a un rapport avec le "chargement" du projet, mais introuvable dans ma solution.

C'est censé être dans la class "Program" , ma "Form1" ou à un endroit que je ne connais pas ? :(

Merci en tous cas pour le coup de main.
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
17 déc. 2012 à 16:38
Bon bah ... je ne trouve vraiment pas :( même en fouillant sur le net rien à faire.
Je ne vois pas ce qu'est ce "shown", certains en parlent ouais mais ... sans plus.
J'ai essayé également de mettre ces bouts de code dans un "Form1_Load ...", mais c'est pareil.

De l'aide ?

D'avance merci !!
0
L0ci Messages postés 110 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 9 janvier 2013 30
18 déc. 2012 à 11:19
Salut,
Le shown est un évènement du form comme le load. Dans les propriétés de ton form il faut donc implémenter cet évènement.
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
18 déc. 2012 à 12:18
Donc en gros, dans mon :
public Form1()
{
}


Je dois implémenter un nouveau EventHandler Shown (avec un += new ...) qui renvoie à ma fonction:
private void Form1_Shown(Object Sender, EventArgs e)
        {
        }


Par contre j'ai su le faire pour des changements de valeur dans mes datagrid etc ...
Par exemple:
dataGridView2.CellDoubleClick +=new DataGridViewCellEventHandler(dataGridView2_CellDoubleClick);


mais je ne sais pas du tout comment ça marche pour le Shown :(
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
18 déc. 2012 à 12:26
J'ai essayé de mettre:
public event EventHandler Shown;

sous ma classe
Form1.ActiveForm.Shown += new EventHandler(Form1_Shown);

dans les propriétés de mon Form1
et:
void Form1_Shown(Object Sender, EventArgs e)
        {
            MessageBox.Show("TEST");
        }

pour tester mais rien ne se passe, je ne dois pas être sur la bonne voie
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
18 déc. 2012 à 13:31
C'est bon j'ai trouvé !
J'ai vu comment des gens utilisaient le OnLoad sur Internet et j'ai fait un :
protected override void OnShown(EventArgs e)
        {
//MON CODE
}

sous ma classe et cela fonctionne!

Merci de m'avoir mis sur la voie !
0