Цикл while или потоки?

В настоящее время я программирую на Lego NXT 2.0 с прошивкой leJOS 0.9.1 beta.

У меня есть несколько разных датчиков, таких как датчик цвета и ультразвуковой датчик.

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

Теперь мне интересно, насколько плоха реализация с циклом while на самом деле (с точки зрения операционной системы, например, в трате ресурсов) и как потоковая модель была бы более выгодной (и реализованной)?

MWE:

public class SensorTest {
    static UltrasonicSensor sonic;
    static DifferentialPilot pilot;
    public static final int DISTANCE = 20;

    public static void main(String[] args){
        sonic = new UltrasonicSensor(SensorPort.S1);
        pilot = new DifferentialPilot(8.5, 25, Motor.C, Motor.B);
        int i = 0;      

        while (i < DISTANCE) {
            pilot.forward();
            i = sonic.getDistance();
        }
        pilot.stop();
      }
}

person cherrun    schedule 29.01.2013    source источник
comment
Ваше время выглядит неправильно, не сократится ли я со временем?   -  person BevynQ    schedule 29.01.2013


Ответы (3)


Не имея никакого опыта работы с кубиками Лего (я серьезно завидую), вы должны задать себе несколько серьезных вопросов.

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

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

Например, у вас может быть поток Driver, единственной обязанностью которого является перемещение Lego. Это будет делать запрос нескольких потоков «датчика», чтобы определить, что он говорит, но каждый поток датчика будет опрашивать данные со своей собственной скоростью и не заботиться ни о чем другом.

Вы также можете инвертировать модель, позволяя Driver продолжать движение до тех пор, пока поток Sensor не поднимет какое-то предупреждение и не скажет Driver, что он должен изменить направление.

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

В конце концов, это будет уравновешивание

Серьезно завидую!

person MadProgrammer    schedule 29.01.2013

Теперь мне интересно, насколько плоха реализация с циклом while на самом деле (с точки зрения операционной системы, например, в трате ресурсов) и как потоковая модель была бы более выгодной (и реализованной)?

«Потоковая модель» — это цикл while, выполняемый в каком-то потоке, отличном от основного. Если вас беспокоит потребление ресурсов, вы можете перевести поток в спящий режим на некоторый фиксированный интервал, прежде чем он снова опрашивает значение.

Что касается того, как это реализовано, вам придется прочитать API, но в стандартной программе Java, если вы используете более новый JDK, вы просто создаете класс, который реализует интерфейс Runnable, и передаете этот объект в исполнитель потока.

person Amir Afghani    schedule 29.01.2013

Использование многопоточности или опроса зависит от вашей ситуации. Я полагаю, что поток будет действовать как прерывание при программировании микроконтроллеров. С потоком (или прерыванием) вы можете лучше разбить свой код на модули, сделать его более эффективным. Смотрите эту тему-

Метод на основе опроса или прерывания

person Tucker    schedule 29.01.2013