Windows Form problème d'affichage dans plusieurs listBox

Signaler
-
 MyGhis -
Bonjour à tous,

Je suis en train de créer une application WindowForm afin d'afficher des données provenant d'un Sniffer RF. Ce derniers permet la réception de trames sur plusieurs fréquences à la fois. Du coup mon application utilise le driver de mon sniffer RF pour récupérer les données qui circulent et les affiches en fonction de la fréquence de leurs porteuse (f1, f2, f3..)dans des listBox dédiées...
Je suis arrivé à affiche dynamiquement les données, dans une listBox, provenant d'une seule porteuse (f1 ou f2) et ce avec l'utilisation d'un Thred annexe.
Seulement mon application ce bloque quand je veux faire du multi fréquence et du coup afficher les données dans 2 listBox différentes.
Je me permets de vous mettre une partie de mon code ci dessous. La méthode ManageAll est appelée lors du lancement d'un Thread

private void ManageAll()
{
int SniffTimeOut = 5;
int receiveFrameF1 = 0;
int receiveFrameF2 = 0;
DateTime receiveFrameTime;
byte[] frameF1;
string frameF1String;
byte[] frameF2;
try
{
do
{
lock (m_LockDataTreatment )
{
// Pour la fréquence F1
if (pushBP1 )
{
snifferF1.GetRawTelegram(out frameF1, SniffTimeOut);
receiveFrameTime = DateTime.Now;

this.BeginInvoke(new MethodInvoker(delegate()
{

listBox1.Items.Insert(0, ConvertFrame(frameF1) + " " + receiveFrameTime.ToString());

receiveFrameF1++;

cptTrameF1.Text = receiveFrameF1.ToString();


}));
Thread.Sleep(50);

}

// If Button 3 is actived !
if (pushBP2 )
{
snifferF2.GetRawTelegram(out frameF2, SniffTimeOut);
receiveFrameTime = DateTime.Now;

this.BeginInvoke(new MethodInvoker(delegate()
{
listBox5.Items.Insert(0, ConvertFrame(frameF2) + " " + receiveFrameTime.ToString());
receiveFrameF2++;

cptTrameF2.Text = receiveFrameF2.ToString();
}));
Thread.Sleep(50);

}
}
} while (pushBP1 || pushBP2 );
}
}


En gros ce que je ne comprends pas c'est pourquoi ça fonctionne sur une fréquence mais pas sur deux. J'ai pensé faire un Thread dédié pour chaque listBox mais j'arrive au même résultat...

Merci de votre aide !

Ghis

5 réponses

Je ne sais pas si c est utile ou bonne idée mais a tu essaye a la place des if des Cases?
Apres tu met une boucle infinie pour que ton case marche tjr .
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Statut
Membre
Dernière intervention
21 décembre 2012
1
Salut !!

Tout d'abord pour thefolin : les boucles infinies dans une appli avec formulaire, oublie tout de suite ! c'est la pire des solutions ^^ Encore pire dans un autre thread ! La boucle infinie c'est le formulaire lui-même.
Sinon, si ça marche séparément, je doute qu'un case y change quelque chose ! MyGuis, a-tu exécuté en mode débug ton programme ? Et peut-tu voir où ça merde ?
(Avec des points d'arrêt après chaque "if", et dans tes méthodes "invokées")

Sinon, je trouve le code avec les Invoke asynchro un peu barbare ^^ Je pense que ce serait plus facile à débugger avec des méthodes définies à part, invokée avec un Invoke en synchro !
Je sais pas si ça va te changer la vie, mais moi j'aurais pas confiance de lancer un Invoke dans un thread, qui risque d'être rexécuté ensuite avec un autre Invoke qui démarre, sans trop savoir si l'autre à bien fini ! M'enfin après j'ai jamais utilisé BeginInvoke, seulement Invoke, donc je saurais pas trop dire !
Mais je creuserais là, si t'a des problèmes d'affichage, c'est surement plus un soucis d'accès avec l'Invoke (ça fait beaucoup d'invoke tout ça ^^)

Good luck,

Mad Keyboard
Hello,

Merci pour vos réponses !
Pour répondre à MadKeyboard, oui je suis passé en mode de débug pour voir où ça bug. Mais faire un débug avec un code managé ce n'est jamais simple. J'ai tout de même pu constater que je récupère bien les données venant de mon Sniffer. Donc le souci vient principalement, je pense, de l'affichage. Par contre ton idée d'appeler des méthodes de manière synchro me plait bien. Je vais modifier mon code pour essayer. Si ça ne fonctionne toujours pas je pense que je vais arrêter de vouloir afficher les données séparément en fonction de la fréquence et que je vais tout afficher dans un DataGrid...

Wait and See. En tout cas merci pour les pistes !
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Statut
Membre
Dernière intervention
21 décembre 2012
1
Avec plaisir ^^
Hello,

J'ai été un peu long pour répondre, donc désolé..
En fait j'ai contourner le problème, plutôt que d'utiliser des contrôles ListBox, j'utilise maintenant une contrôle DataGridView à la place . Dont le code est visible ci-dessous et comme par miracle tout fonctionne correctement.
lock (this)
{
dataGridView2.BeginInvoke(new MethodInvoker(delegate()
{
InfoMessage("Frame received");

dataGridView2.DataSource = null;
dataGridView2.DataSource = MyListPowerMeterToDisplay;


dataGridView2.AutoResizeColumns();

dataGridView2.Visible = true;


}));
}

Encore merci pour vos idées !