Remplissage de combo box en parallèle

Signaler
Messages postés
2
Date d'inscription
samedi 5 août 2006
Statut
Membre
Dernière intervention
28 janvier 2010
-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
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

Messages postés
2
Date d'inscription
samedi 5 août 2006
Statut
Membre
Dernière intervention
28 janvier 2010

Bonjour,

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

Merci.
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
29
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!