Thread erreur

Signaler
Messages postés
10
Date d'inscription
samedi 2 décembre 2000
Statut
Membre
Dernière intervention
14 avril 2008
-
Messages postés
10
Date d'inscription
samedi 2 décembre 2000
Statut
Membre
Dernière intervention
14 avril 2008
-
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

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
63
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)
Messages postés
10
Date d'inscription
samedi 2 décembre 2000
Statut
Membre
Dernière intervention
14 avril 2008

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 ?.
Messages postés
10
Date d'inscription
samedi 2 décembre 2000
Statut
Membre
Dernière intervention
14 avril 2008

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.