Probléme passage de tableau entre deux form

Résolu
msahli3 Messages postés 6 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 19 mars 2009 - 27 févr. 2009 à 18:36
msahli3 Messages postés 6 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 19 mars 2009 - 2 mars 2009 à 12:36
Bonjour , je suis débutant dans le C# , j'ai une forme principale  (le moteur ) qui récupère des données a partir d'une DLL (driver) en temps réel et les affiches dans une 2eme forme (pour visualiser la trace des données ), les données sont mis dans un buffeur(appartient a la classe forme1) par la forme1, le buffeur est copié périodiquement dans une tableau appartenant a la classe de la forme 2, le probleme se pose lorsque j'essaye d'afficher la copy du buffeur dans la form2 (la trace) j'ai une erreure qui dit que le tableau n'est pas referencié alors que je l'ai initialiser dans le constructeur de la forme2.
moi je voudrai savoir la méthaude la plus optimale pour passer un tableau entre 2 classe a chaque évenement d'une des classe. 
merci

la fonction qui fait passer le tableau
classe forme1
{
.........
protected void OnIdle(object sender, EventArgs e)
        {
trace_ = new form2();
 trace_.Recieve_Bffr_MessageAPI(CppMessageCSharp_bfr, index_bff_cpp);
}
}
classe forme2
{
...
 public void Recieve_Bffr_MessageAPI(CppMessageCSharp[] CppMessageCSharp_, int index)
        {
           
          
            for (int i = 0; i < index; i++)
            {
               CppMessageCSharp_bfr[i] = CppMessageCSharp_[i];
            }
}
public void afficher_trace(int index)
{
listItems_.Add(CppMessageCSharp_bfr[index]);
/********** ici j'ai l'erreur lors de l'execution ,l'objet n'est pas referené ,sachant que la fonction affichage est périodiquement appelé par un timer ****/

}
}

3 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
28 févr. 2009 à 11:57
Bonjour
Tu es en face d'un problème de type Producteur/Consomateur
une forme produit, une autre consome.
il faut donc être certain que ce que tu consomes est bien produit.

il existe plusieurs méthodes, mais la régle de base est que la forme qui produit possede le tableau, et c'est elle qui doit y inserrer les données.
Dans ton exemple, la forme 1 utilise une méthode de la forme 2 pour remplir le tableau, ce n'est pas très bon.

la méthode la plus simple est d'utiliser un evenement.
La forme 1 inserre des données dans le tableau et lance un evenement attendu par la forme 2 qui va traiter les données
L'inconvenient de cette méthode est qu'elle est synchrone, la forme 1 devra attendre que la forme 2 ait fini avant d'inserrer de nouveaux éléments.

une autre méthode consiste à utuliser des ArrayList synchronisés, à la place des tableaux standards.
ex:
// Creation d'une liste dans la forme 1.
ArrayList MonTableau =
new ArrayList();

// Création d'un "handle" pour syncrhonisation toujours dans la forme 1
ArrayList MonTableauSynchro = ArrayList.Synchronized( MonTableau );
la forme 1 travaillera toujours sur la liste réelle "MonTableau"
alors que la forme 2 utilisera l'instance synchronisée "MonTableauSynchro" qu'elle pourra récupérer par exemple dans son constructeur.
 

Bon code.
C# is amazing, enjoy it!
1
msahli3 Messages postés 6 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 19 mars 2009
2 mars 2009 à 12:14
Merci Robert , je vais tester cette solution et je t'informe du résultat obtenu. 
0
msahli3 Messages postés 6 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 19 mars 2009
2 mars 2009 à 12:36
mais le problème qui se pose est que moi je voudrai passer au consommateur un tableau de structure (il me faut toud les champs de la struct) , et un ArrayList ne permet ça , je voudrai bien essayer un moyen qui me permet de fair passer un tableau de structuer en temps réel.
merci.
0
Rejoignez-nous