2016-06-15 5 views
0

У меня есть пакет UDP, который транслируется в интервале времени для позиции GPS. В настоящее время он транслируется каждые 50 мс. У меня есть обработчик событий, который создается на каждом новом пакете, а затем обрабатываю пакет и вызываю другой код. Трансляция достаточно последовательна, но может немного колебаться. Время от времени либо из-за того, что пакет ускоряется, либо мой код становится зависающим, у меня возникают проблемы/рост очереди событий, потому что я не вернулся, чтобы ждать следующего события, потому что либо следующий пакет пришел слишком быстро, либо вызываемый код не является полным.Ошибка обработки событий обработчика событий

Итак, возникает вопрос, является ли обработчик событий лучшим для использования здесь? Я думаю, что они есть, а затем поднимает следующий вопрос, что лучше всего сделать, чтобы я был готов к следующему пакету.

У меня есть две мысли:

  1. По вопросам, где пакет приходит слишком быстро, может быть, я просто бросить его и ждать следующего. Другими словами, если каждые 50 мс хороши для меня, я устанавливаю это как порог. Если пакет приходит через 30 мс, я знаю, что он пришел слишком быстро, и я его отбрасываю и жду следующего, так что колебания во времени не влияют на меня. Это может быть хорошей защитой в случае, если что-то идет haywire и пакеты отправляются каждые 1 мс.

  2. Для обработчика событий, возможно, обработчик просто прослушивает и принимает пакет, но затем запускает задачу или поток для обработки, чтобы обработчик событий мог сразу вернуться и быть готовым к следующему пакету? Вот где я застрял, потому что мой ум подсказывает мне, что вы можете запустить синхронизацию, когда последующие потоки будут выполняться быстрее, чем предыдущие потоки (я говорю потоки, но могут быть задачами или пулом потоков), и теперь вы все не в синхронизации, проблематично для чего-то вроде местоположения GPS. Я не уверен, как реализовать что-то подобное и решить проблемы с синхронизацией.

Помощь и предложения будут оценены!

Спасибо!

+0

50 мс не совсем «слишком быстро» на современной машине. Но ваша программа, безусловно, может и будет кататонической дольше, чем это время от времени. Вы * должны * иметь дело с возможностью того, что вы получаете два пакета сразу после друг друга с промежутком менее одного мсек. Возможно, вам придется использовать ключевое слово * lock *, зависит. Разумный способ сделать это - проверить свою программу с очень высокой скоростью. Как только это будет работать надежно, вы поймете, что все будет хорошо с частотой 50 мс. –

ответ

1

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

По сути, у вас, похоже, есть очередь с входящими сообщениями в очередь, получаемую обработчиком событий, но я подозреваю, что вы используете обработчик событий для обработки пакета.

Лучшим вариантом было бы использовать обработчик событий ТОЛЬКО для добавления входящего пакета в общий экземпляр очереди. Затем вы можете иметь фоновый поток, который выгружает элементы из очереди и обрабатывает их. Это означает, что не имеет значения, насколько быстро поступают пакеты.

+0

Я согласен с этим решением. Сделать Eventhandler просто поместить входящие объекты либо в стек, либо в очередь. Поэтому после этого не стесняйтесь обрабатывать очередь. Если вам нужна поддержка потоков, я рекомендую ConcurrentQueue. Cheers – lokusking

+0

Спасибо всем, позвольте мне исследовать это и попытаться сделать первый проход. Если у меня возникнут какие-либо проблемы во время выполнения, я отправлю сообщение еще раз. –

Смежные вопросы