2013-07-31 4 views
2

Я разрабатываю программное обеспечение для Android, где я должен слушать n-количество портов, скажем 10. Каждые 100 мс я хочу проверить, есть ли у портов новый UDP-пакет. После получения пакета данные внутри должны быть переданы в UI-поток.Несколько портов и потоки

Мой вопрос: должен ли я использовать один поток для приема данных из всех разных портов или я должен создать собственный поток для каждого порта, каждый из которых рассчитан на 100 мс интервал? Какова хорошая практика в этих случаях?

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

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

+0

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

+0

Да, я просто не уверен, что я должен создать один временной поток и проверить внутри него каждый порт. – Tumetsu

+0

вы должны создать потоки для захвата данных и одного таймера, который проверяет эти потоки каждый 100 мс. – bas

ответ

1

Наличие потока в сокете кажется излишним, и если время для де-сериализации объекта не является чрезмерным, вы не увидите никакой выгоды.

Лично (и, как указано в баре, в нем мало чего) Я бы начал просто и проверил один поток, проверяя 10 портов круглым и спальным между проверками. Если вы начнете обнаруживать, что Thread занимает слишком много времени, обрабатывая данные, и время между каждым проверенным портом слишком велико, вы можете добавить в этот поток больше потоков.

+0

Спасибо. Я думаю, что это, вероятно, так, как я собираюсь идти сейчас, так как десериализация не должна занимать слишком много времени. – Tumetsu

+0

Что? 10 потоков переполнены? –

+0

Хорошо, переполнение было неправильным словом. Может быть, «чрезмерное» будет более уместным. – StuPointerException

1
My question is should I use one thread to receive data from all different ports or 
should I create own thread for every port, each timed to run at 100ms interval? 
What is the good practice in these cases? 

Это не имеет большого значения. Если вы создаете один поток, вам придется отслеживать разные порты. Если вы создаете несколько потоков, вам нужно отслеживать все эти потоки. Поскольку cpu, как правило, многопоточны в настоящее время, я бы пошел на несколько потоков.

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

+0

Хорошо, спасибо. Мне просто интересно, можно ли выиграть, используя отдельные потоки для каждого порта, так как imo обычно больше потоков = больше сложности, по крайней мере в этом случае. – Tumetsu

+0

'больше threads = больше сложности'? Вы должны поставить «0..9» для цикла вокруг создания потока. Для меня это не слишком сложный вопрос. –