2010-05-05 74 views
1

在一個程序(Java)中,我使我需要檢查並行端口中的特定引腳。只要該引腳從邏輯0變爲1(正沿時鐘),我必須讀取端口上的數據並保存。這發生在每10ms左右,但可能會有所不同。不間斷地檢查一個端口

要做到這一點我做了一個while循環,是不斷檢查端口一個單獨的線程,但是這使得處理器發瘋,我知道這是因爲while循環。我的問題是,如何在不使用處理器密集型while循環的情況下不斷掃描端口?該程序不知道什麼時候會發生引腳變化,只是它發生在每10ms左右。

+1

什麼是您的操作系統?我想你一定會需要一個支持採樣的內核驅動程序來使這個可靠。 – Daniel 2010-05-05 22:09:33

+0

我的操作系統是Windows XP Professional。看起來,使用定時器進行調度確實可行,並且不是處理器密集型的。 – Hans 2010-05-07 16:09:31

回答

6

激發一個預定執行給定Runnable的線程以固定的速率。您可以使用Timer#scheduleAtFixedRate()ScheduledExecutorService#scheduleAtFixedRate()。最後一個是preferred

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()此刻您的應用程序退出,否則線程可能會掛起。

1

這是真正棘手趕上當你的代碼不作爲操作系統的一部分運行的硬件中斷。你可以做的是把Thread.Sleep(5)。這會休眠10毫秒,並讓其他線程運行或只保持CPU空閒和冷卻。有5毫秒的延遲應該足以確保不會錯過任何時鐘滴答。

當您的時鐘在10毫秒高和10毫秒低之間交替時,這將工作。對於其他模式,您必須相應地調整參數。

3

有可能是一個更好的解決方案,但最壞的情況下你可以只Thread.sleep爲1-2MS while循環的每次迭代。

+1

向我展示一個OS,當使用Thread.sleep(2)調用線程時,線程不會睡眠至少10ms。 – Daniel 2010-05-05 22:06:30

+0

Win/Linux做得很好,上次我測量了他們,而Google的一個快速搜索似乎也支持這一點。但是自從大學以後我就沒有使用過Java,並且隨着時間的推移,粒度可能會變差。 – 2010-05-05 22:17:43