Постоянная проверка порта без цикла 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 мс. Для других паттернов вы должны соответствующим образом настроить параметр.