0 votes

L'événement interfère avec les sous-programmes

J'ai du mal avec un événement lié à mon cours de communication.

J'appelle une fonction 'DataChange' via un gestionnaire d'événements chaque fois que je reçois de nouvelles données sur ma connexion série. Je charge ensuite ces données dans un DataGridView, je procède à un certain formatage, etc. pour les utilisateurs. Je rencontre une tonne de problèmes en raison de la fréquence à laquelle l'événement DataChange est appelé et semble voler la vedette à d'autres sous-routines et fonctions en cours de processus.

Par exemple, je vais essayer de transmettre des données au périphérique série. Après avoir formaté les données, mais avant que je puisse appeler la fonction Send de ma bibliothèque, le focus est renvoyé sur DataChange et je ne transmets jamais mes données.

La meilleure façon de résoudre ce problème consiste-t-elle à threader les routines liées à DataChange, à décrocher l'événement DataChange avant une fonction ou une routine, puis à le raccrocher à nouveau, ou y a-t-il un principe de base que je n'applique pas ?

1voto

Brett Allen Points 1989

Il semble qu'il puisse s'agir d'un problème de synchronisation de threads.

Les événements sont intrinsèquement liés à des fils, et il n'y a donc pas de problème à les traiter en ajoutant des fils.

Essayez d'utiliser SyncLock pour assurer la synchronisation des fils.

Chaque fois que vous recevez des données, verrouillez un objet jusqu'à ce que vous ayez fini d'utiliser les données.

SyncLock lockObject
    'Handle data changed...
End SyncLock

Je crois que le terme pour cette situation est une condition de course.

0voto

Chris Haas Points 23212

Faites en sorte que vos données entrent dans un tampon sur un fil et regardez le tampon depuis un autre fil. Sur le thread primaire, marquez le tampon comme "prêt à envoyer" et demandez au thread secondaire de le surveiller. Veillez à ce que l'objet soit verrouillé par SyncLock. Selon la nature de vos données, vous pouvez créer un objet pour les envelopper et utiliser un drapeau booléen, puis les transférer dans une liste (de T). Demandez à votre thread de surveillance de dormir pendant 50 millisecondes, de verrouiller le tampon et de vérifier les drapeaux, d'extraire ce qui est nécessaire, de déverrouiller la liste et d'expédier les données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X