Remplissage de combo box en parallèle

siilex Messages postés 2 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 28 janvier 2010 - 26 janv. 2010 à 14:28
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 - 31 janv. 2010 à 08:26
Bonjour,

Dans mon programme, j'ouvre une fenêtre qui génère et affiche x combobox.
Chaque combobox contient un liste d'heures (0000; 0015 0030... 2400).
J'aimerais optimiser le processus en parallélisant le remplissage de ces x combobox (via x threads ?).
Pourriez-vous me renseigner ?

Merci d'avance.

2 réponses

siilex Messages postés 2 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 28 janvier 2010
28 janv. 2010 à 17:17
Bonjour,

Est-ce impossible ou bien trop compliqué ? Y aurait-il une autre méthode à utiliser ?

Merci.
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
31 janv. 2010 à 08:26
Bonjour

Non ce n'est ni impossible ni compliqué, mais ce n'est pas certain que ce soit éficasse, tout dépend du programme, si les threads sont trés rapides et s'ils ne font pas ou peu d'entrées sorties alors le résultat peut être plus lent.

voici la démarche:
on défini une classe de thread avec sa méthode d'execution
le trhead va émettre ses informations via un evenement qui sera piégé par la forme de base

Thread procedure:
    public class MyThreadClass
    {
        public delegate void EventDelegate (int index, string data);
        public event EventDelegate myevent;

        int _index;
        public MyThreadClass(int index)
        {
            _index = index;
        }
        public void ThreadProc()
        {
            for (int i=0; i< 100; i++)
            if (myevent != null)
                myevent(_index , string.Format("Thread {0} loop {1}",_index,i));
        }
    }


dans la forme de base on défini le traitement des évenements, en prenant soin de verifier que les combobox sont bien accessibles, sinon on met en place un Invoke.

//delegate pour l'Invoke local
        private delegate void FeedComboDelegate (ComboBox combo,string data);
        //Traitement de l'évenement en provenance du thread
        void threadClass_myevent(int index, string data)
        {
            ComboBox combo = Controls["comboBox" + index] as ComboBox;
            if (combo.InvokeRequired)
                combo.Invoke(new FeedComboDelegate(FeedCombo), new object[] { combo, data });
            else
                FeedCombo(combo, data);

        }
        //remplissage de la comboBox
        private void FeedCombo(ComboBox box, string data)
        {
            box.Items.Add(data);
        }


il suffit alors d'ajouter une methode de lancement des thread
dans l'exemple il y a 3 combobox (comboBox1 à comboBox3) sur la form et un bouton pour le lancement:
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 1; i <= 3; i++)
            {
                MyThreadClass threadClass = new MyThreadClass(i);
                threadClass.myevent += new MyThreadClass.EventDelegate(threadClass_myevent);
                Thread onethread = new Thread(threadClass.ThreadProc);
                onethread.Start();
            }
        }



C# is amazing, enjoy it!
0
Rejoignez-nous