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!