web-dev-qa-db-fra.com

Utilisation de C # pour les applications en temps réel

C # peut être utilisé pour développer une application en temps réel qui implique de prendre entrée de Web Cam en continu et de traitement de l'entrée?

25
nishant

J'ai utilisé C # pour créer plusieurs applications de vision de la machine en temps réel, à grande vitesse, qui fonctionnent 24h/24 et 7j/7 et que des machines en mouvement dépendent de l'application. Si quelque chose ne va pas dans le logiciel, quelque chose de immédiatement et visiblement ne va pas dans le monde réel.

J'ai trouvé que c # /. Net fournit une très bonne fonctionnalité pour le faire. Comme d'autres l'ont dit, restez définitivement sur la collecte des ordures. Rompez-vous pour traiter plusieurs étapes logiques et avoir des threads séparés qui travaillent chacun. J'ai trouvé le modèle de programmation des consommateurs de producteurs pour bien travailler pour cela, peut-être Concurrentqueue pour commencer.

Vous pourriez commencer avec quelque chose comme:

  • Le fil 1 capture l'image de la caméra, le convertit à un format et la met en image
  • Le fil 2 consume à partir de l'imageQueue, le traitement de l'image et propose un objet de données mis sur une traitée.
  • Le fil 3 consomme de la procédure et fait quelque chose d'intéressant avec les résultats.

Si le fil 2 prend trop de temps, les threads 1 et 3 se racbrent encore. Si vous avez un processeur multicœur, vous lancerez plus de matériel au calcul des mathématiques. Vous pouvez également utiliser plusieurs threads à la place de tout fil que j'ai écrit ci-dessus, même si vous devriez vous occuper de commander manuellement les résultats.

Edit

Après avoir lu des réponses d'autres peuples, vous pourriez probablement affirmer ma définition de "temps réel". Dans mon cas, l'ordinateur produit des objectifs qu'il envoie aux contrôleurs de mouvement qui font le mouvement réel en temps réel. Les contrôleurs de mouvement fournissent leurs propres couches de sécurité pour des raisons telles que la synchronisation, les gammes max/min, l'accélération/décélérations et les capteurs de sécurité. Ces contrôleurs lisent des capteurs sur une usine entière avec une durée de cycle inférieure à 1 ms.

15
bufferz

Vous ne pouvez utiliser aucune langue de poubelle principale collectée pour les "systèmes en temps réel durement", car la collecte des ordures empêchera parfois le système répondant dans une heure définie. Éviter l'allocation d'un objet peut aider, mais vous avez besoin d'un moyen de prouver Vous ne créez aucune ordure et que le collecteur des ordures ne s'engagera pas.

Cependant, la plupart des systèmes "en temps réel" n'ont-ils pas besoin de toujours réagir dans un délai difficile, de sorte que tout s'agit de ce que vous entendez par "temps réel".

Même lorsque des parties du système doivent être "difficiles en temps réel" souvent autres grandes parties du système comme l'interface utilisateur ne le font pas.

(Je pense que votre application doit être rapide plutôt que "en temps réel", si une image est perdue tous les 100 ans combien de personnes seront tuées?)

34
Ian Ringrose

Absolument. La clé sera d'éviter autant que possible la collecte des ordures et la gestion de la mémoire. Essayez d'éviter les objets nouveaux autant que possible, en utilisant des tampons ou des pools d'objets lorsque vous le pouvez.

8
David Pfeffer
  • Bien sûr, quelqu'un a même développé une bibliothèque pour le faire: Aforge.net
  • Comme pour toute application en temps réel et non seulement C #, vous devrez gérer les tampons comme @David suggérés.
  • Non seulement cela, il y a aussi le Cadre de Xna (pour des choses comme des jeux 3D) et vous pouvez programmer DirectX Utilisation de C #, qui sont très en temps réel.
  • Et saviez-vous que, si vous voulez, vous pouvez faire manipulations de pointeur en C # aussi?
4
chakrit

Cela dépend de la "fois en temps réel"; C'est-à-dire quelles sont vos contraintes de synchronisation et à quelle vitesse vous devez "faire quelque chose".

Si vous pouvez gérer "faire quelque chose" peut-être tous les 300ms ou plus à .NET, disons sur un événement de minuterie, j'ai trouvé que Windows fonctionne correctement. Notez que c'est quelque chose que j'ai trouvé vrai sur plusieurs systèmes d'âges différents et de vitesses différentes. Comme toujours, ymmv.

Mais ce nombre est terriblement long pour beaucoup d'applications. Peut-être pas pour le tien.

Faites des recherches, assurez-vous que votre application répond rapidement à votre demande.

1
J. Polfer