2009-12-14 3 views
0

Je suis aux prises avec un événement lié à ma classe de communication.L'événement interfère avec les sous-programmes

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

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

S'agit-il d'un problème résolu par l'exécution des routines DataChange, en décrochant l'événement DataChange avant une fonction ou une routine puis en le rééchantillant, ou y a-t-il un principe de base que je n'applique pas.

+0

Avez-vous résolu votre problème? –

Répondre

1

Cela semble être un problème de synchronisation de thread.

Les événements sont intrinsèquement threadés, donc l'adresser en ajoutant un thread n'est pas un problème. Essayez d'utiliser SyncLock pour assurer la synchronisation des threads.

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 concurrence.

0

Vos données entrer dans un tampon sur un thread et regarder le tampon d'un autre thread. Sur le thread primaire, marquer le tampon comme "prêt à envoyer" et faire surveiller le thread secondaire. Assurez-vous simplement de SyncLock l'objet. En fonction de vos données, vous pouvez créer un objet pour l'envelopper et utiliser simplement un drapeau booléen, puis le vider dans une liste (Of T). Faites en sorte que le fil de votre moniteur reste en veille pendant 50 ou quelques millisecondes, verrouillez le tampon et vérifiez les drapeaux, sortez ce qui est nécessaire, déverrouillez la liste et expulsez les données.

Questions connexes