Постоянная проверка порта без цикла while - PullRequest
1 голос
/ 06 мая 2010

В программе (Java), которую я делаю, мне нужно проверить наличие определенного контакта в параллельном порту. Всякий раз, когда этот вывод меняется с логического 0 на 1 (тактовая частота положительного фронта), я должен прочитать данные в порту и сохранить их. Это происходит примерно каждые 10 мс, но может немного отличаться.

Для этого я создал отдельный поток с циклом while, который постоянно проверяет порт, но это заставляет процессор сходить с ума, и я знаю, что это из-за цикла while. У меня вопрос, как я могу постоянно сканировать порт, не используя интенсивный процессор во время цикла? Программа не знает точно, когда произойдет смена пина, только то, что это происходит каждые 10 мс.

Ответы [ 3 ]

6 голосов
/ 06 мая 2010

Запустить поток, для которого запланировано выполнение заданного Runnable с фиксированной скоростью. Для этого вы можете использовать Timer#scheduleAtFixedRate() или ScheduledExecutorService#scheduleAtFixedRate(). Последний предпочтительный .

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new PortScanner(), 0, 10, TimeUnit.MILLISECONDS); // Run every 10 ms.

Где PortScanner может выглядеть так:

public class PortScanner implements Runnable {
    @Override
    public void run() {
        // Scan port here.
    }
}

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

3 голосов
/ 06 мая 2010

Возможно, есть лучшее решение, но в худшем случае вы можете просто Thread.sleep в течение 1-2 мс на каждую итерацию цикла while.

1 голос
/ 06 мая 2010

Действительно сложно ловить аппаратные прерывания, когда ваш код не работает как часть операционной системы. Что вы можете сделать, это поставить Thread.Sleep (5). Это будет спать в течение 10 миллисекунд, и позволит другим потокам работать или просто держать процессор простаивающим и охлажденным. Задержка в 5 мс должна быть достаточной, чтобы не пропустить такты.

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

...