[SWING] Precisione del timer

di il
2 risposte

[SWING] Precisione del timer

Salve a tutti,

Devo realizzare un'animazione con la libreria swing di java e in particolare con la classe Timer. Il problema che ho è che se imposto al timer una velocità di 1-5 millisecondi non è preciso e il minimo che riesce a generare è di 10-12 millisecondi. Per risolvere il problema dell'attesa ho dovuto eliminare la classe timer e crearmene uno mio custom con una funzione waitTimer del tipo:
codice:
private void waitTimer() {        int count1 = 0;
        long time=0;
        long startTime = System.nanoTime();
        while (time < timer) {
            while(count1 <= 200) 
                count1++;
            count1=0;
            time = (System.nanoTime()-startTime);
        }
    }
Con questa funzione finalmente posso passare all'evento successivo con il tempo che voglio, volendo anche inferiore al millisecondo!. L' unico problema è che questa soluzione non è precisa in quanto se impongo che deve aspettare 1 millisecondo capita che a volte aspetti 1 millisecondo ( la maggior parte delle volte ) e a volte ( raramente ) di più, anche 10 millisecondi, così rendendo l'animazione poco fluida. Vorrei sapere se conoscete soluzioni più "corrette" e più "precise" che mi possano far utilizzare la classe Timer di swing garantendo un tempo di 1-2 millisecondi.

Grazie anticipatamente

2 Risposte

  • Re: [SWING] Precisione del timer

    Il problema e' complicato:

    1) il timer di sistema ha una risoluzione di 1/64 di secondo (15.6 ms)
    2) il timer di sistema e' una risorsa condivisa da tutti i processi
    3) sei in un sistema multiprocesso/multithreading: la tua applicazione usa le risorse in condivisione con gli altri processi

    Quindi, non c'e' modo di assicurare una temporizzazione precisa, a mano di non andare a livello di kernel del s.o. Ma anche in questo caso, piu' di tanto non puoi fare perche' il s.o. deve comunque eseguire delle operazioni con specifiche scadenze

    La soluzione adottata e' sbagliata: stai usando un ciclo stretto per il controllo del timer. Questo implica che stai sprecando tempo di cpu che potrebbe essere utilizzato molto piu' efficacemente.

    Esiste una soluzione, ma non e' quello che speri:

    1) NON usare il timer per le temporizzazioni
    2) usare il concetto di evento (o messaggio)

    Quando arriva un evento da processare, calcoli quanto tempo e' passato dall'evento precedente e usi questo valore per i tuoi scopi.

    In questo modo, puoi usare il timer per generare eventi, ma ti svincoli da una temporizzazione precisa. Ti basta che gli eventi arrivino con una frequenza sufficiente a rendere fluida la tua applicazione.
  • Re: [SWING] Precisione del timer

    Ti ringrazio per la risposta.
    Io devo realizzare un'animazione in cui due componenti JLabel si muovono nel Panel. Quindi per effettuare ciò non faccio altro che richiamare i metodo setLocation(x,y) in cui setto all'iterazione i-esima la posizione dei JLabel. Per avere un'animazione fluida ho bisogno di un timer più veloce cosa che non me lo permette il timer di swing ( è un'animazione di 20 secondi massimo ). Volevo sapere se in generale esistono librerie migliori per l'animazione con java al posto dello standard swing con il quale mi trovo benissimo come interfaccia grafica ma con le animazioni trovo sempre dei problemi. Oppure sono io , evidentemente, che non ho capito come realizzare una qualsiasi animazione con swing.
Devi accedere o registrarti per scrivere nel forum
2 risposte