[Threads] Impossible depuis autre fonction

Résolu
MoYoX Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   -  
MoYoX Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   30
 
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   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   30
 
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   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   30
 
Ç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   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   30
 
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   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   3
 
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