Сложная проблема многопоточности Android, ищет некоторые рекомендации

1

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

Я пытаюсь использовать одноядерный телефон Android android 2.2 для проведения некоторых исследований. Я реализовал алгоритм, который выполняет множество расчетов и создает много данных. Эти данные должны быть обработаны, а решение представлено обратно клиентскому приложению в течение 40 мс, а затем снова обрабатывать новые данные состояния, поступающие от клиента. Кроме того, результат расчетов должен быть сохранен на SD-карте в виде журнала данных. Так что, будучи новичком в многопоточности и Android, я должен использовать следующие действия в своем приложении: (Как примечание, этот телефон, когда в исследовательском режиме не предназначен для использования в качестве телефона, телефон будет находиться в режиме полета с отключенной беспроводной связью, и все приложения, которые могут быть отключены, будут отключены, и нет необходимости в отображении или взаимодействии с пользовательским интерфейсом после его запуска и запуска...)

  1. необходимо обрабатывать пакеты, поступающие через adb на последовательный порт, эти пакеты представляют собой данные состояния, которые программа должна выполнять для своих вычислений. Эти пакеты будут поступать каждые 40 мс, поэтому я планировал использовать их прибытие для запуска начала обработки.
  2. нужно знать, длится ли алгоритм дольше 40 мс, и отмените его, если это так, и отправьте сообщение на последовательный порт, который он перестал.
  3. результаты вычислений должны быть отправлены обратно через последовательное соединение через tcp и adb
  4. Промежуточные данные расчета необходимо записать в SD. Это может быть довольно много данных, порядка 140k, каждые 40 мс.

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

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

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

Итак, допустив эту настройку, могу ли я сделать часть алгоритма этой несколько детерминированной так, чтобы она всегда выполнялась, если она получает новый пакет tcp, и упреждающая запись SD в фоновом режиме?

Argh... должен был выбрать что-то более простое для моей первой программы

Благодарю.

  • 0
    Запускайте новый поток (в службе приема пакетов) каждый раз, когда вы получаете пакет, и делегируйте IntentService, когда придет время для записи на SD-карту, чтобы избежать головной боли параллелизма.
Теги:
multithreading
algorithm
android-sdcard

1 ответ

1
Лучший ответ

Да, я думаю, что вы правы, что было бы лучше выбрать что-то проще для вашего первого приложения;) Но насколько я понимаю, что вы пытаетесь сделать, я не думаю, что вам нужна асинхронная многопроцессорность. Вы получаете некоторые данные, которые хотят обработать их и передать результат. Я считаю, что HandlerThread - именно то, что вы ищете. Он может получать сообщения с данными внутри. Вы отправляете их обработчику и обрабатываете их в переопределенном методе handleMessage (Message m). Поэтому каждый раз, когда вы получаете сообщение, вы можете просто зарегистрировать время и посмотреть, будет ли последний старше вашего лимита. Если это так, вы можете просто выбросить сообщение или всю очередь или отправить сообщение в ваш последовательный порт, вызывая переполнение. Это может быть реализовано, как вы предлагаете в службе. Другой HandlerThread можно запустить с помощью Thread.PRIORITY_BACKGROUND, чтобы написать все для SD. Вы можете отправлять сообщения даже очень удобно, если вы применяете Messenger к Handlers

  • 0
    Благодарю. Я сделаю это и опубликую свой результат здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню