Постоянная проверка порта без цикла while

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

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

3 ответа

Решение

Запустить поток, который запланирован для выполнения данного 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() в данный момент ваше приложение закрывается, иначе поток может зависнуть.

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

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

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

Другие вопросы по тегам