Question

Ma question est de faire des commentaires sur la façon de s'assurer que je prends la bonne approche et que je gére correctement le filetage. J'ai le sentiment que j'ai besoin de mettre en place certains de mes propres fils, donc tous les commentaires sont les bienvenus.

Le problème que j'ai est de lire les balises RFID de zéro ou plus de lecteurs RFID. Je peux lire pour un seul lecteur sans problème, donc la lecture de plusieurs ne sera pas un problème. Chaque étiquette ou lot de balises lues par le lecteur est livré par un événement .NET.

Mon plan est de configurer une classe ReaderControl, qui maintient les lecteurs, la connexion, le démarrage, l'arrêt, etc. Cette classe écoutera le Étiquette Événements des lecteurs. À chaque événement qu'il gère (environ toutes les 250 ms), il met les ID d'étiquette de lecture (une chaîne) dans un hashset pour les garder uniques, le hashset est situé dans ReaderControl. Le ReaderControl contiendra une minuterie, qui tire / s'écoule toutes les 500 ms, cet événement en minute Balise un événement. Le but de cela est de garder l'événement à tirer au minimum et de réduire les balises en double.

La Éreintes de tags L'événement est géré par une autre classe appelée TagTranslator. Cette classe traversera les ID de balise (chaînes) et déterminera ce à quoi la balise fait référence, c'est-à-dire un objet IPERSON. Cette classe animera un événement à la fin de la traduction avec un Peupleen un événement.

La Peupleen L'événement est géré par un modèle dans une GUI (modèle MVP). L'idée globale est un affichage GUI est des noms de personnes qui traversent les lecteurs RFID. L'affichage est simplement mais évidemment sous les hottes, les balises sont lues dans ASYCH et ont été traduites par des objets "réels" à afficher.

Pensez-vous que ReaderControl devrait fonctionner sur son propre fil, je pense que c'est le cas. Comment puis-je emballer cette classe dans son propre fil pour continuer à lire les balises, peu importe ce que fait l'interface graphique. Pensez-vous également que lorsque le TagTranslator lors de la manipulation des événements doit créer des threads pour gérer la traduction.

Était-ce utile?

La solution

Je dirais que, plutôt que d'utiliser des événements, vous utilisez une structure de données de file d'attente simultanée et un modèle de consommateur unique producteur multiple. Considérez les threads du lecteur de balises comme des producteurs et le fil de traitement comme des consommateurs.

Lorsqu'un fil reçoit une balise d'un lecteur, il ajoute cette balise à la file d'attente, sans se soucier des doublons ou quoi que ce soit. Diable, tu pourrais vouloir Cette information en double à un moment donné. Aucune raison de le jeter ici.

Le consommateur attend la file d'attente, enlevant des articles et en les traitant un à la fois.

La BlockingCollection La classe est parfaite pour cela.

// Shared queue.  Assuming that a tag is simply a string.
BlockingCollection<string> TagQueue = new BlockingCollection<string>();

// Tag reader threads (producers)
while (!ShutdownMessageReceived)
{
    string tag = GetTagFromReader(); // however that's done
    TagQueue.Add(tag);
}

// Processing thread (consumer)
while (!ShutdownMessageReceived)
{
    string tag = TagQueue.Take();
    // process the tag
}

BlockingCollection Prend en charge plusieurs producteurs et consommateurs, vous pouvez donc en avoir autant que vous le souhaitez. La Take La méthode se bloque jusqu'à ce qu'un élément soit disponible. C'est une attente non busée, il n'y a donc pas de sondage au-dessus.

Ce genre de chose est très facile à mettre en œuvre avec BlockingCollection, et fait un code propre et simple qui fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top