Salut tout le monde
J'ai crée une application Windows Forms.
Quel élément graphique dois-je utiliser pour faire des affichage en temps réel.
Par exemple avec des listbox ça attend la fin des traitements pour afficher le résultat.
Merci de votre aide
Salut tout le monde
J'ai crée une application Windows Forms.
Quel élément graphique dois-je utiliser pour faire des affichage en temps réel.
Par exemple avec des listbox ça attend la fin des traitements pour afficher le résultat.
Merci de votre aide
Précise un peu ce que tu fais... quel traitement ? Je suppose que tu récupères des données directement dans le thread de l'UI ? Si tu fais ça, l'affichage ne peut pas se rafraichir tant que le traitement n'est pas fini, puisque le thread UI est occupé. Il faut donc faire ton traitement dans un autre thread
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Ce sont des lectures de BDD
Je suis obligé d'attendre la fin de l'execution de mon boucle for pour que l'affichage soit exécuté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 for (int i = 0; i < 1000; ++i) { dr.Read(); int numDossie = (new formatageLigneSql(dr)).get_NUMDOSSIE(); if (numDossieEtude != null) { listBox1.Items.Add(numDossie); } else { listBox1.Items.Add("NULL"); } listBox1.Items.Add(""); }
Comme dit plus haut, utiliser un thread secondaire.
L'autre possibilité est d'utiliser le contrôle ListView qui possède un mode dit "virtuel" permettant d'appeler la lecture des données au fur et à mesure du scrolling.
Avant tout merci de m'avoir mis sur la piste.
J'ai un peux galéré, car j'étais dans mon FORM.
Et les thread et les Form ne s'aiment pas trop.(On ne peut pas interagir sur les Form à partir d'autre Thread).
Je met l'erreur pour ceux qui aurons le même problème.
Je suis parvenu à le résoudre en passant par les invoke.Opération inter-threads non valide : le contrôle 'listBox1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
Voila mon code
Et voila mon appelle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14private delegate void ThreadWriteDelegateHandler(Object wri); private ThreadWriteDelegateHandler ThreadWriteDelegate; private void ThreadProcess(Object wri) { ThreadWriteDelegate = new ThreadWriteDelegateHandler(ThreadWrite); this.Invoke(this.ThreadWriteDelegate, new object[] { ((String)wri) }); } public void ThreadWrite(Object wri) { listBox1.Items.Add(wri); }
Donc beaucoup de code pour faire juste un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3Thread t = new Thread(new ParameterizedThreadStart(ThreadProcess)); t.Start("toto");
en ''asynchrone''.listBox1.Items.Add(wri);
Mais je ne suis pas au bout de mes peine.
Comment je peux faire pour faire plusieurs appelles sans tuer et recréer mes Thread ?
Par exemple
ne marche pas.t.Start("toto");
t.Start("toto");
t.Start("toto");
D'abord, pour le Invoke tu as une solution plus simple :
Et tu n'as pas besoin de lancer un nouveau thread qui va juste faire un Invoke sur le thread de l'UI... tu peux appeler Invoke à partir de ton thread de traitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part this.Invoke(new Action(() => listBox1.Items.Add("toto")));
Par contre Invoke est bloquant, autrement dit ton traitement sera interrompu jusqu'à ce que l'appel avec Invoke se termine. Ce n'est pas forcément gênant (à voir selon les cas), mais si ça te pose un problème tu peux utiliser BeginInvoke à la place, qui est non-bloquant.
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Partager