2010-05-05 6 views
1

프로그램 (Java)에서 병렬 포트의 특정 핀을 확인해야합니다. 그 핀이 논리적 인 0에서 1 (포지티브 에지 클럭)이 될 때마다 포트의 데이터를 읽고 저장해야합니다. 이것은 약 10ms마다 발생하지만 조금 다를 수 있습니다.while 루프를 사용하지 않고 포트를 계속 검사합니다.

이 작업을 수행하기 위해 끊임없이 포트를 확인하는 while 루프가있는 별도의 스레드를 만들었지 만 프로세서가 중단되고 while 루프가 원인 인 것으로 알고 있습니다. 내 질문은, 어떻게 지속적으로 프로세서 집중적 인 루프를 사용하지 않고 포트를 스캔 할 수 있습니까? 이 프로그램은 핀 교환이 언제 일어날 지 정확히 알지 못하며 단지 10ms마다 발생합니다.

+1

OS가 무엇입니까? 믿을만한 샘플링을 지원하는 커널 드라이버가 꼭 필요합니다. – Daniel

+0

내 OS는 Windows XP Professional입니다. Timer가 작동하고 너무 프로세서 집약적 인 것은 아닙니다. – Hans

답변

6

고정 속도로 주어진 Runnable을 실행하도록 예약 된 스레드를 실행합니다. 이 경우 Timer#scheduleAtFixedRate() 또는 ScheduledExecutorService#scheduleAtFixedRate()을 사용할 수 있습니다. 마지막은 preferred입니다. PortScanner는 다음과 같이 할 수

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

:

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

순간에 당신의 응용 프로그램이 종료를 scheduler.shutdown()를 호출하는 것을 잊지 마세요, 다른 스레드가 중단 될 수 있습니다.

1

코드가 운영 체제의 일부로 실행되지 않을 때 하드웨어 인터럽트를 잡는 것은 정말 까다 롭습니다. 당신이 할 수있는 것은 Thread.Sleep (5)를 넣는 것입니다. 이것은 10 밀리 초 동안 잠자기 상태가되어 다른 스레드가 실행되거나 CPU가 유휴 상태로 유지되도록합니다. 5ms의 지연은 클록 틱을 놓치지 않을 정도로 충분해야합니다.

시계가 10ms에서 10ms 사이에서 교대로 바뀔 때 작동합니다. 다른 패턴의 경우 매개 변수를 적절하게 조정해야합니다.

3

더 나은 해결책이있을 수 있지만 최악의 경우 while 루프 반복마다 1-2ms 동안은 Thread.sleep 수 있습니다.

+1

Thread.sleep (2)로 호출 할 때 스레드가 적어도 10ms 동안 대기 상태가 아닌 OS 하나를 보여주십시오. – Daniel

+0

Win/Linux가 좋았습니다. 지난 번에 측정했는데 빠른 Google 검색이이를 지원하는 것 같습니다. 그러나 대학 때부터 Java를 사용하지 않았으며 시간이 지남에 따라 세분성이 악화되었을 수도 있습니다. –

관련 문제