Domanda

In un programma (Java) sto facendo ho bisogno di verificare la presenza di un perno specifico nella porta parallela. Ogni volta che il pin va da 0 logico a 1 (un orologio fronte positivo) devo leggere i dati sulla porta e salvarlo. Questo accade circa ogni 10 ms, ma può variare un po '.

Per fare questo ho fatto un thread separato con un ciclo while che è costantemente controllando la porta, ma questo rende il processore impazzire e so che è a causa del ciclo while. La mia domanda è, come posso costantemente la scansione del porto senza utilizzare un processore ciclo while intensivo? Il programma non sa con precisione quando un cambiamento perno avverrà, solo che accade intorno a ogni 10ms.

È stato utile?

Soluzione

Fuoco una filettatura che è prevista per eseguire la proposta Runnable ad un tasso fisso. È possibile utilizzare Timer#scheduleAtFixedRate() o ScheduledExecutorService#scheduleAtFixedRate() per questo. L'ultimo è preferito .

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

Dove PortScanner può assomigliare a questo:

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

Non dimenticare di chiamare scheduler.shutdown() in questo momento i tuoi chiusura dell'applicazione, altrimenti il ??filo potrebbe bloccarsi.

Altri suggerimenti

Ci potrebbe essere una soluzione migliore, ma peggiore dei casi si può solo Thread.sleep per 1-2ms ogni iterazione del ciclo while.

E 'davvero difficile per la cattura di interrupt hardware quando il codice non è in esecuzione come parte del sistema operativo. Che cosa si può fare è di mettere Thread.Sleep (5). Ciò dormire per 10 millisecondi, e lasciare che gli altri thread correre o semplicemente tenere al minimo della CPU e raffreddare. Avendo ritardo di 5 ms dovrebbe essere sufficiente a garantire non mancherà alcun clock ticks.

Questo potrebbe funzionare quando l'orologio si alterna tra 10 ms di altezza e 10 ms basso. Per gli altri modelli è necessario regolare il parametro di conseguenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top