Istanziare una classe per un temporizzatore.

di il
6 risposte

Istanziare una classe per un temporizzatore.

Ciao a tutti,

In questi giorni ho iniziato a creare una applicazione che mi dovrà permettere di leggere dei valori da di spositivi in rete. il problema in cui mi sono imbattuto è stato quello di creare delle variabili di lampeggio con frequenze di verse per animare in modo eventi con priorità differente.
Ad esempio volevo creare un bit con frequenza 1hz, ed un'altro con frequenza di 2hz.

Ho cercato in rete, ed anche qui nel forum, ed ho visto che ci sono due modi per creare un temporizzatore, con Java.Swing e con Java.Util.
La prima se ho ben capito, vive all'interno di un frame con l'action listener, la secondo invece è indipendente dal frame e viene invocato con il metodo run.

Ora gli esempi che ho visto, istanziano i temporizzatori nella stessa classe del main, quello che io invece avevo pensato (corregetemi se sbaglio), era di creare due classi esterne al main (con Java.util), una per il lampeggio a 1hz ed un'altra per quello a 2hz, e dichiarare un public boolean, da poter utilizzare in qualsiasi parte del software abbia la necessità di farlo.

l'esempi dalla quale sono partito è questo:

import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.*;
import javax.swing.*;

class Test
{
public static void main(String[] args)
{
Timer timer=new Timer();
timer.schedule(new Task(),0,250);//parti subito e itera ogni 250ms
}
}

class Task extends TimerTask
{
boolean blink;
public void run()
{
blink=!blink;
System.out.println(Boolean.toString(blink));
}
}

ho provato a scrivere una classe separata che istanziasse il temporizzatore, ed un'altra con il main che la facesse partire, ma non ci sono riuscito.
Potreste illuminarmi su cosa fare per raggiungere il mio obbiettivo?

Grazie.
Duccio.

6 Risposte

  • Re: Istanziare una classe per un temporizzatore.

    Duccio ha scritto:


    ho visto che ci sono due modi per creare un temporizzatore, con Java.Swing e con Java.Util.
    La prima se ho ben capito, vive all'interno di un frame con l'action listener, la secondo invece è indipendente dal frame e viene invocato con il metodo run.
    Il Timer di Swing si basa sul concetto dei listener e sul dispacciamento di "eventi" nel contesto del Event Dispatch Thread. È molto appropriato quando non serve alta precisione e specialmente se il "lavoro" temporizzato deve operare sulla interfaccia utente.

    Il Timer di java.util invece è più generico, non c'entra nulla con listener, AWT/Swing, EDT, ecc... ed è gestito con un suo thread specifico.

    Duccio ha scritto:


    ho provato a scrivere una classe separata che istanziasse il temporizzatore, ed un'altra con il main che la facesse partire, ma non ci sono riuscito.
    Potreste illuminarmi su cosa fare per raggiungere il mio obbiettivo?
    Il succo di tutto sarebbe fare qualcosa del tipo:
    Timer timer = new Timer();
    timer.schedule(new Task1(), 0, 500);     // (1 Hz con "blink")
    timer.schedule(new Task2(), 0, 250);     // (2 Hz con "blink")
    ecc...

    Poi dove siano definite le classi Task1/Task2 NON ha granché importanza. Potrebbero essere esterne alla classe dove c'è questo codice, potrebbero essere delle "nested" (static) class, potrebbero essere definite come "anonymous" inner class.
  • Re: Istanziare una classe per un temporizzatore.

    Ciao,
    Grazie per le info,

    io ho provato a fare questo:
    import java.util.Timer;
    import java.util.TimerTask;
    import java.awt.event.*;
    import javax.swing.*;
    
    class Temp{
       public static void crea(){
              Timer timer = new Timer();
              timer.schedule(new Task1(), 0, 500);     // (1 Hz con "blink")
              timer.schedule(new Task2(), 0, 250);     // (2 Hz con "blink")
       }
    }
    
    class Task1 extends TimerTask{
       public static boolean blink1;
       public void run(){
              blink1=!blink1;
       }
    }
    
    
    class Task2 extends TimerTask{
       public static boolean blink2;
       public void run(){
              blink2=!blink2;
       }
    }
    Il problema è che pur avendo dichiarato le variabili blink1 e blink2 come Static non riesco a vederle nelle altre classi.
    Ma le Static non dovrebbero essere visibili a tutte le classi?
  • Re: Istanziare una classe per un temporizzatore.

    Duccio ha scritto:


    Il problema è che pur avendo dichiarato le variabili blink1 e blink2 come Static non riesco a vederle nelle altre classi.
    Ma le Static non dovrebbero essere visibili a tutte le classi?
    Un membro "static" vuol solo dire che è associato alla classe (quindi è uno solo, "globale" per così dire), non associato a ciascun distinto oggetto della classe. Se un membro è visibile o meno ad altre classi, questo dipende dal "livello di accesso" del membro.
    E un campo "public static" di fatto È tecnicamente accessibile da qualunque altra classe.

    Ma c'è un'altra questione, MOLTO più importante, legata al "threading". I run() dei task vengono eseguiti nel contesto di un thread specifico, creato appositamente dal Timer.
    Anche andando a fare Task1.blink1 (questo è il modo di accedere a quel campo), in QUALE thread intendi farlo? Se è ovviamente differente dal thread del timer, entrano in gioco le noiose, subdole e critiche questioni sui thread. Detto in generale, senza alcuna sincronizzazione o perlomeno senza prendere alcuna precauzione, NON C'È alcuna "garanzia" che la modifica ad una variabile (sebbene "globale") fatta da un thread A, sia "visibile" da un thread B.

    Quindi le domande ora sono: perché vuoi accedere a quei blink1/blink2 da altre classi? Cosa pensavi di fare?
  • Re: Istanziare una classe per un temporizzatore.

    Premetto che io provengo dalla programmazione di PLC, che è ben lontana dal concetto di programmazione in java o qualsiasi altro linguaggio di alto livello. Detto ciò, io sto cercando di crearmi un'applicazione che si possa collegare al PLC, e visualizzare alcune variabili.
    Queste variabili, in base al loro valore (che potrà significare un warning o un'allarme) dovranno lampeggiare con frequenza diversa.
    Da qui ho pensato che si potesse creare una variabile di lampeggio da utilizzare in qualsiasi classe mi sia necessaria.

    Ma naturalmente questa era la mia idea da neofita, quindi ti chiedo gentilmente di consigliarmi una soluzione o di indicarmi una via in modo da poterci sbattere.

    Grazie mille per la tua disponibilità.
    Saluti.
    Duccio.
  • Re: Istanziare una classe per un temporizzatore.

    Duccio ha scritto:


    sto cercando di crearmi un'applicazione che si possa collegare al PLC
    Beh, come effettuare la comunicazione .... dipende. Seriale? USB? Networking (LAN/wireless)?

    Duccio ha scritto:


    e visualizzare alcune variabili.
    Cioè esattamente? Leggere qualcosa dal PLC ogni tot di tempo? O il contrario?
  • Re: Istanziare una classe per un temporizzatore.

    La comunicazione sarà ethernet utilizzando una libreria per il protocollo scritta in java, nella libreria c'è già un main che esegue una sola volta alcuni metodi di esempio, tipo la connessione, la lettura del buffer di diagnostica ed alcuni comandi tra cui start e stop della cpu.

    Per leggere intendo tutto quello che esiste nella cpu, che potrebbe essere un'area di memoria intera, booleana etc etc. oppure lo stato della cpu, se in errore oppure no, e naturalmente anche scrivere. Ma come ti dicevo per il protocollo del PLC utilizzerò la libreria.

    Un'altra cosa invece che mi hai fatto venire in mente è il fatto che il ciclo di comunicazione lo devo eseguire ciclicamente quindi dovrò pensare anche come crearlo.

    Saluti.
    Duccio.
Devi accedere o registrarti per scrivere nel forum
6 risposte