utilisation du C# pour des applications en temps réel

C# être utilisé pour le développement d'une application temps-réel qui consiste à prendre de l'entrée de web cam en permanence et de traitement de l'entrée?

22
demandé sur Nelson Rothermel 2010-09-21 19:54:06

5 réponses

j'ai utilisé C# pour créer de multiples applications de vision en temps réel, à grande vitesse, qui fonctionnent 24 heures sur 24, 7 jours sur 7 et dont les machines mobiles dépendent de l'application. Si quelque chose se passe mal dans le logiciel, quelque chose se passe mal immédiatement et visiblement dans le monde réel.

j'ai trouvé que C#/.Net fournit des fonctionnalités assez bonnes pour le faire. Comme d'autres l'ont dit, Restez au sommet de la collecte des ordures. La séparation jusqu'au traitement en plusieurs étapes logiques, et ont séparé fils travaillant chacun. J'ai trouvé que le modèle de programmation de consommation du producteur fonctionne bien pour cela, peut-être ConcurrentQueue pour commencer.

Vous pourriez commencer avec quelque chose comme:

  • Thread 1 capture l'image de la caméra, la convertit en un format quelconque, et la met dans un ImageQueue
  • Thread 2 consomme à partir de L'ImageQueue, le traitement de l'image et vient avec un objet de données qui est mis sur une ProcessedQueue
  • Thread 3 consomme à partir de la ProcessedQueue et fait quelque chose d'intéressant avec les résultats.

si le Thread 2 prend trop de temps, les Threads 1 et 3 sont toujours en cours. Si vous avez un processeur multicœur vous ferez de plus de matériel de mathématiques. Vous pouvez également utiliser plusieurs threads à la place de n'importe quel thread que j'ai écrit ci-dessus, bien que vous ayez à prendre soin de commander les résultats manuellement.

Modifier

après avoir lu les réponses d'autres personnes, vous pourriez probablement contester ma définition de"temps réel". Dans mon cas, l'ordinateur produit des cibles qu'il envoie aux contrôleurs de mouvement qui font le mouvement réel en temps réel. Les régulateurs de mouvement fournissent leurs propres couches de sécurité pour des choses comme le chronométrage, les plages max/min, les accel/décélérations lisses et les capteurs de sécurité. Ces contrôleurs lisent les capteurs sur l'ensemble d'une usine avec un temps de cycle inférieur à 1ms.

12
répondu bufferz 2010-09-21 20:33:30

vous ne pouvez pas utiliser de langage de collecte des ordures en flux principal pour les "systèmes durs en temps réel", car la collecte des ordures empêchera parfois le système de répondre dans un temps défini. Éviter d'allouer l'objet peut aider, cependant vous avez besoin d'un moyen de prouver vous ne créez aucun déchet et que le collecteur d'ordures ne va pas donner un coup de pied.

cependant, la plupart des systèmes "en temps réel" n'ont pas besoin de répondre toujours dans une limite de temps difficile, de sorte que tout descend faire ce que vous dire par "temps réel".

même lorsque des parties du système doit être "dur temps réel" souvent Autre pièces du système comme L'UI ne le fait pas.

(je pense que votre application doit être rapide plutôt que de "temps réel", si 1 cadre est perdu tous les 100 ans, combien de personnes vont se faire tuer?)

30
répondu Ian Ringrose 2011-11-11 12:34:21

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

5
répondu David Pfeffer 2010-09-21 15:55:39
  • 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 pas seulement C#, vous devrez gérer les tampons comme @David l'a suggéré.
  • non seulement cela, il ya aussi le XNA Framework (pour des choses comme les jeux 3D) et vous pouvez programmer DirectX en utilisant C# qui sont très en temps réel.
  • et saviez-vous que, si vous voulez, vous peut faire pointeur de manipulations en C# trop?
4
répondu chakrit 2010-09-21 16:03:16

cela dépend de la façon dont cela doit être "en temps réel", c'est-à-dire de vos contraintes de temps et de la vitesse à laquelle vous devez "faire quelque chose".

si vous pouvez gérer "faire quelque chose" peut-être tous les 300ms ou plus dans .NET, disons lors d'un événement de minuterie, J'ai trouvé Windows pour bien fonctionner. Notez que c'est quelque chose que j'ai trouvé vrai sur plusieurs systèmes d'âges et de vitesses différentes. Comme toujours, YMMV.

mais ce nombre est terriblement long pour beaucoup d'applications. Peut-être pas pour la vôtre.

faites quelques recherches, assurez-vous que votre application répond assez rapidement pour votre application.

1
répondu J. Polfer 2010-09-21 16:03:32