chris31500
Messages postés10Date d'inscriptionsamedi 2 décembre 2000StatutMembreDernière intervention14 avril 2008
-
4 févr. 2008 à 12:35
chris31500
Messages postés10Date d'inscriptionsamedi 2 décembre 2000StatutMembreDernière intervention14 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.
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 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;
chris31500
Messages postés10Date d'inscriptionsamedi 2 décembre 2000StatutMembreDernière intervention14 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.