Запустить два кода одновременно c #

У меня такая ситуация в приложении, которое я разрабатываю, где мне нужно делать две вещи одновременно, и я как бы борюсь с этим. Я занимаюсь разработкой приложения для камеры, и мне нужно включить камеру одновременно со светодиодом, чтобы получить хорошее изображение. Ниже приведены варианты, которые я пробовал.

Используйте две темы:

Thread t1 = new Thread(
                    new ThreadStart(() =>
                    {
                        //trigger LED here
                    }));

Thread t2 = new Thread(
                    new ThreadStart(() =>
                    {
                        //trigger camera
                    }));

t1.Start();

t2.Start();
t1.Join();
t2.Join();

Включите свет на текущем потоке, а камеру на отдельном потоке

Thread t = new Thread(
                    new ThreadStart(() =>
                    {
                        //trigger camera
                    }));

// trigger LED
t.Start();
t.Join();

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

Спасибо.

 falopsy23 мая 2013 г., 13:19
@BobSammers; спасибо за ваш пост. Звонки незаблокировать основной поток.
 Matthew Watson23 мая 2013 г., 12:30
Не существует метода аппаратного интерфейса, чтобы сделать оба одновременно? Я полагаю, выиспользуете API для общения с оборудованием?
 falopsy23 мая 2013 г., 13:07
@ Matthew, Mzf: Привет, камера и светодиод - это два разных оборудования. Я запускаю светодиод через последовательный вызов и камеру прямо из его API.
 Bob Sammers23 мая 2013 г., 12:46
Я могу'я не вижу двух потоков лучше - даже если вам удастся запустить их одновременно на двух разных процессорных ядрах (что, я подозреваю, маловероятно и, в любом случае, невозможно контролировать), они 'столкнется с доступом к аппаратной шине, и выв конечном итоге с последовательной активацией. Я полагаю, что было бы лучше просто активировать одну за другой в том же потоке (или блокировать вызовы до завершения действия? Существует ли асинхронная версия вызова, если так?).
 Mzf23 мая 2013 г., 12:37
Как уже упоминалось, вам нужно прочитать API, предоставляемый вашим оборудованием / стеком. Высокая вероятность того, что есть API для активации обоих

Ответы на вопрос(4)

Как вы управляете двумя устройствами (USB)? У вас может быть два физических ЦП, которые могут выполнять операции одновременно, но если вашему интерфейсу (-ам) нужны одинаковые каналы связи, вы обнаружите задержку.

Кроме того, вы можете увеличить приоритет своих потоков, если они критичны по времени.

Если вы хотите синхронизировать потоки, вы должны использовать некоторую форму синхронизации потоков, такую как мьютекс, но если вы не можете гарантировать, что у вас (и ваших клиентов) есть два ЦП, вам может быть лучше выполнить две операции в критической секции, пока установка вашей нити в критическое время. Увидетьэтот ответ для деталей об этом.

 falopsy23 мая 2013 г., 13:13
Привет Бернхард, спасибо за твой пост. Камера подключена к USB, а светодиод - к последовательному устройству. Я'попробую приоритетную вещь и доложу здесь.

Если у вас есть два (или более) действия, вы можете вызывать их параллельно, используя

Parallel.Invoke( () => DoCamera(), () => DoLighting() );

Однако этоЛучшая попытка Там'нет никакой гарантии, потому что в конце концов вы можете выполнить это на машине с одним физическим процессором или, может быть,s под большой нагрузкой и в любом случае осталось только 10% процессора.

 nvoigt23 мая 2013 г., 13:20
Потому что это'Лучшее, что он может получить, нет гарантии во всей .NET Framework. Никакая часть программного обеспечения не может гарантировать параллелизм на машине, которая неТ даже гарантированно иметь два процессора.
 Bob Sammers23 мая 2013 г., 13:36
Я не согласен - лучшее, что он может сделать, это изменить приоритет потока, как предлагает Бернхард Хофманн, и, если они нево время действия выполните два вызова в одном потоке
 Bob Sammers23 мая 2013 г., 13:12
@nvoigt: тогда зачем предлагать это как решение? Это неничего не делать ОПпример несделать (хотя это аккуратнее) и онs уже заявил, что нет работа.
Решение Вопроса

Если ты можешь'Решить это аппаратно - вот лучший подход, который я могу придумать для ОС не в реальном времени, такой как Windows:

Начните один поток для каждого из двух действийПоднимите их приоритеты на Высокий или В реальном времени, чтобы они сразу же пнули что-нибудь еще из процессораЗаставь их ждатьBarrier, Это гарантирует, что оба потока запущены и проверены на барьере перед продолжением. Это помогает уменьшить временной джиттер. Это не гарантирует, что оба потока выполняют свои аппаратные действия одновременно, но это поможет.

Если это не поможет, я нене знаю, что будет. Хотя стоит попробовать. Операционная система не гарантирует выполнение в режиме реального времени, но с частотой процессора до 3 ГГц вы можете достичь потрясающих скоростей в реальном времени.Переключение контекста может занять 3000 циклов, что составляет 0,000001 секунды. Таким образом, вы абсолютно точно можете достичь очень точных сроков.

 falopsy23 мая 2013 г., 21:05
Вот Это Да! Это работает как шарм. Я считаю, что это именно то, для чего предназначен Barrier: я думаю, что не нужно повышать приоритет (но в некоторых других случаях, возможно, но я смотрю на снижение производительности 3 процессов реального времени на компьютере, но в моем случае нормальный приоритет достаточно хорош ). Программа работает в течение 30 минут (около 1500 кадров и не мигает). Я фактически синхронизирую 2 камеры с 1 светодиодом, и это решение работает хорошо. Спасибо.

То, что вы действительно просите, - это тесная связь между оборудованием (триггером камеры и светодиодом) и структурой программирования для достижения "в режиме реального времени» ОПЕРАЦИОННЫЕ СИСТЕМЫ. Windows не является операционной системой реального времени - Microsoft 'Цель состояла в том, чтобы разработать платформу, которая в основном не зависит от оборудования, на котором она работает.

Даже для потоков - как только вы попросите CLR ускорить поток, естьбез гарантии что поток, начнет работать в течение указанного интервала времени (ссылкаCLR через C #).

Ваш ответ на вопрос