Подтвердить что ты не робот

Использование С# для приложений реального времени

Может ли С# использоваться для разработки приложения реального времени, которое требует непрерывного ввода данных из веб-камеры и обработки ввода?

4b9b3361

Ответ 1

Я использовал С# для создания нескольких высокоскоростных приложений машинного зрения в режиме реального времени, которые работают круглосуточно и работают в зависимости от приложения. Если в программном обеспечении что-то идет не так, то в реальном мире что-то сразу и явно идет не так.

Я обнаружил, что С#/.NET обеспечивает довольно хорошую функциональность для этого. Как уже говорили другие, определенно оставайтесь на вершине сбора мусора. Разбейте обработку на несколько логических шагов, и у каждого из них будут отдельные потоки. Я обнаружил, что модель программирования Producer Consumer хорошо подходит для этого, возможно, ConcurrentQueue для начинающих.

Вы можете начать с чего-то вроде:

  • Поток 1 захватывает изображение с камеры, преобразует его в некоторый формат и помещает в ImageQueue
  • Поток 2 использует ImageQueue, обрабатывает изображение и создает объект данных, который помещается в ProcessedQueue.
  • Поток 3 использует ProcessedQueue и делает что-то интересное с результатами.

Если поток 2 занимает слишком много времени, потоки 1 и 3 все еще продолжаются. Если у вас многоядерный процессор, вы будете использовать больше математики. Вы также можете использовать несколько потоков вместо любого потока, который я написал выше, хотя вам придется позаботиться о том, чтобы упорядочить результаты вручную.

редактировать

Прочитав ответы других людей, вы, вероятно, можете поспорить с моим определением "в реальном времени". В моем случае компьютер производит цели, которые он посылает контроллерам движения, которые выполняют фактическое движение в реальном времени. Контроллеры движения предоставляют свои собственные уровни безопасности для таких вещей, как синхронизация, максимальные/минимальные диапазоны, плавное ускорение/замедление и датчики безопасности. Эти контроллеры считывают датчики по всей фабрике с временем цикла менее 1 мс.

Ответ 2

Вы не можете использовать какой-либо основной сборщик мусора для "жестких систем реального времени", поскольку сбор мусора иногда останавливает реакцию системы в определенное время. Избегание выделения объекта может помочь, однако вам нужен способ доказать, что вы не создаете мусор и что сборщик мусора не будет пинать.

Однако большинство систем "реального времени" на самом деле не должны всегда реагировать в трудные сроки, поэтому все сводится к тому, что вы подразумеваете под "реальным временем".

Даже если части системы должны быть "жесткими в режиме реального времени", часто другие большие части системы, такие как пользовательский интерфейс.

(Я думаю, что ваше приложение должно быть быстрым, а не "реальным временем", если один кадр теряется каждые 100 лет, сколько человек будет убито?)

Ответ 3

Совершенно верно. Ключ будет состоять в том, чтобы избежать сбора мусора и управления памятью как можно больше. Старайтесь избегать новых объектов как можно больше, используя буферы или пулы объектов, когда сможете.

Ответ 4

  • Конечно, кто-то даже разработал библиотеку, чтобы сделать это: AForge.NET
  • Как и в случае с любым приложением реального времени, а не только с С#, вам нужно будет управлять буферами, а также предлагать @David.
  • Кроме того, существует XNA Framework (для таких вещей, как 3D-игры), и вы можете запрограммировать DirectX, используя С#, которые являются очень реальными.
  • И знаете ли вы, что, если хотите, вы можете сделать манипуляции с указателями на С#?

Ответ 5

Это зависит от того, как "в реальном времени" он должен быть; т.е. каковы ваши ограничения по времени, и как быстро вам нужно "что-то делать".

Если вы можете обрабатывать "что-то", возможно, каждые 300 мс или около того в .NET, скажем, в событии таймера, я нашел, что Windows работает нормально. Обратите внимание, что это то, что я нашел правдой в разных системах разного возраста и разных скоростях. Как всегда, YMMV.

Но это число очень долго для многих приложений. Возможно, не для вас.

Проведите некоторое исследование, убедитесь, что ваше приложение достаточно быстро реагирует на ваше приложение.