1

プログラム(Java)で、パラレルポートの特定のピンをチェックする必要があります。そのピンが論理0から1(立ち上がりエッジクロック)になるたびに、ポートのデータを読み取って保存する必要があります。これは約10ミリ秒ごとに発生しますが、少し異なる場合があります。

これを行うために、ポートを常にチェックしているwhileループを使用して別のスレッドを作成しましたが、これによりプロセッサが混乱し、whileループが原因であることがわかります。私の質問は、プロセッサを集中的に使用するwhileループを使用せずに、ポートを常にスキャンするにはどうすればよいですか?プログラムは、ピンの変更がいつ発生するかを正確に認識しておらず、10ミリ秒ごとに発生することだけを認識しています。

4

3 に答える 3

6

Runnable指定された を固定レートで実行するようにスケジュールされたスレッドを起動します。Timer#scheduleAtFixedRate()これにはまたはを使用できますScheduledExecutorService#scheduleAtFixedRate()。最後の 1 つが優先されます。

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()と、スレッドがハングする可能性があります。

于 2010-05-05T21:08:26.293 に答える
3

より良い解決策があるかもしれませんが、最悪の場合Thread.sleep、while ループの反復ごとに 1 ~ 2 ミリ秒かかる可能性があります。

于 2010-05-05T21:09:27.503 に答える
1

コードがオペレーティング システムの一部として実行されていない場合、ハードウェア割り込みをキャッチするのは非常に困難です。できることは、 Thread.Sleep ( 5 ) を配置することです。これは 10 ミリ秒間スリープし、他のスレッドを実行させるか、単に CPU をアイドル状態にして冷却状態に保ちます。5 ミリ秒の遅延があれば、クロック ティックを見逃すことはありません。

これは、クロックが 10 ミリ秒の高さと 10 ミリ秒の低さを交互に繰り返している場合に機能します。他のパターンについては、それに応じてパラメーターを調整する必要があります。

于 2010-05-05T21:07:41.490 に答える