Thread erreur

chris31500 Messages postés 10 Date d'inscription samedi 2 décembre 2000 Statut Membre Dernière intervention 14 avril 2008 - 4 févr. 2008 à 12:35
chris31500 Messages postés 10 Date d'inscription samedi 2 décembre 2000 Statut Membre Dernière intervention 14 avril 2008 - 4 févr. 2008 à 14:45
Bonjour,

je bloque sur un problème tout bete d'accès multi thread :

J'ai une interruption RS422 qui appelle une méthode qui doit modifier un databinding source.

Chacun de ces 3 éléments est dans un fichier/classe différent. Voici ma méthode qui modifie la variable (dans timerdash) :

void ajouter_tiroir(
CDefDiscret discretTmp){

int indexObj = -1;

for (
int k = 0; k < liste_tiroir.Count; k++){

if (((
CDefDiscret)(liste_tiroir[k])).NomSignal == discretTmp.NomSignal)
   indexObj = k;}

if (indexObj == -1)
   liste_tiroir.Add(discretTmp);

else
   liste_tiroir[indexObj] = discretTmp;

}

C'est donc liste_tiroir.Add qui me pose problème à l'exécution, me disant qu'il y a un accès multithread.
En effet, liste_tiroir est déclaré dans ma classe principale. Et je l'injecte dans ma méthode de la sorte :

timerDashConnection.liste_tiroir =

this.cDiscretTiroirBindingSource;

avec timerdash, qui contient les méthodes de timerdash.

J'ai tenté de faire des invoke, mais je n'ai même pas la propriété disponible quand je tappe : "this."

Ce n'est pas très clair, mais mon programme est énorme, je ne peux donc pas tout mettre.

J'espère que quelqu'un pourra m'aider.

J'ai parcouru tous les forums du web francophone, et je ne trouve rien pour m'aider.
J'espère trouver ici ma réponse.

Je préviens également, je ne suis pas développeur de formation, mais électronicien. Je développe en ce moment un programme en C#, que j'ai repris d'un collègue (informaticien) parti de la société. Autant dire que c'est pas évident.

Merci par avance pour votre aide.

3 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
4 févr. 2008 à 13:07
Hello, et bienvenue sur le forum.

Tu parles d'une interruption RS422, est-ce que ça te semble possible que deux de ces interruptions arrivent dans un temps très court ?

Essaie peut-être comme ça :

void ajouter_tiroir(CDefDiscret discretTmp) 

{
int indexObj = -1;
lock(liste_tiroir)
{
for (int k = 0; k < liste_tiroir.Count; k++)
{
if (((CDefDiscret)(liste_tiroir[k])).NomSignal == discretTmp.NomSignal)
   indexObj = k;

}
if (indexObj == -1)
   liste_tiroir.Add(discretTmp);
else
   liste_tiroir[indexObj] = discretTmp;
}
}

C'est sans aucune garantie, mais j'espère que ça marcheras.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
chris31500 Messages postés 10 Date d'inscription samedi 2 décembre 2000 Statut Membre Dernière intervention 14 avril 2008
4 févr. 2008 à 14:03
Pas mal tenté, mais ça ne change absolument rien :(

Sinon, j'ai une interruption traitée toute les secondes. Ce qui laisse largement le temps de décoder le message.


 


Une autre solution ?.
0
chris31500 Messages postés 10 Date d'inscription samedi 2 décembre 2000 Statut Membre Dernière intervention 14 avril 2008
4 févr. 2008 à 14:45
Si ça peut aider à comprendre mon besoin :

je souhaite créer une variable complexe dans mon programme principal, la modifier grace à une méthode externe à la classe (appelée par interruption) puis la lire dans mon programmme principal . Le invoke a l'air adapté, mais je n'arrive pas du tout à le mettre à l'oeuvre, et j'ai lu le tutotirel du site.
0
Rejoignez-nous