Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    18

    [Java] Settare un Timer...

    Ciao a tutti, volevo sapere se si può settare in java un timer (senza usare Socket) che alla scadenza di un tempo "t" mi consente di interrompere l'esecuzione di un metodo e di ritornare al chiamante.


    Grazie anticipatamente a tutti coloro che mi risponderanno...


    Ciao

    -=Bellio=-

  2. #2
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Re: [Java] Settare un Timer...

    Originariamente inviato da bellio
    (senza usare Socket)
    E cosa c'entrano le Socket??


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    18
    Grazie per il consiglio Xadoom, ma la classe Timer fa parte del package javax.swing.Timer e nel mio codice non implemento nessuna interfaccia grafica. Quindi non sò se mi può servire.. Ne esiste una classe simile "Timer" nel package java.util ma serve a schedulare un qualunque task ad un istante predefinito, quindi non può farmi da sveglia per l'interruzione di un metodo...


    e LeleFT con i Socket intendevo questo:
    >Socket sock= new Socket();
    >sock.setSoTimeout(timeout);
    > try{
    > risultato= oggetto.metodo();
    > }catch (SocketTimeoutException e) {
    > //codice
    > }

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Allora devi usare i Thread:
    codice:
    public class MioTimer extends Thread {
       public MioTimer() {
          ...
       }
    
       public void run() {
          try {
             sleep(tempo_in_millisecondi);
             ... // Interrompi il metodo
          } catch (InterruptedException ie) { ie.printStackTrace(); }
       }
    }
    Il thread si lancia usando il metodo start():
    codice:
    MioTimer mt = new MioTimer();
    mt.start();
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    18
    Si in effetti ho provato già una soluzione simile così
    codice:
    public void run(){
            ThreadCompute q = new ThreadCompute();
            q.setDaemon(true);
            q.start();//faccio partire il metodo
            try {
                sleep(timer);
            } catch (InterruptedException e) {
                
            }
            //Se è ancora vivo mando l'interrupt
            if(q.isAlive()) q.interrupt();
    }
    Ma per mia sfortuna questa soluzione continua a non adarmi bene perchè se il metodo finisce prima del timeout è costretto ad aspettare in ogni caso la scadenza del timeout, cosa che non vorrei!

    Il timeout serve solo a controllare che il metodo non resti in esecuzione all'infinito, quindi entro un Tempo massimo. Ma se finisce prima possibilmente non vorrei aspettare la fine del timeout.

    Cmq spero di trovare una soluzione, grazie lo stesso!

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Allora devi agire in un altro modo:
    devi passare a ThreadCompute un riferimento al thread che lo lancia e non attendere il tempo di millis in un sol colpo ma ad ogni millisecondo:
    codice:
    // Nel thread principale
    private int tempo;
    private boolean flag;
    public ThreadPrincipale() { flag = true; ... }
    public void run() {
            ThreadCompute q = new ThreadCompute(this); // Qui passo il riferimento
            q.setDaemon(true);
            q.start();//faccio partire il metodo
            try {
                while (flag && tempo<timer) {
                   tempo++;
                   sleep(1);  // Attendo un millisecondo prima di effettuare nuovamente il controllo
                }
            } catch (InterruptedException e) {
                
            }
            //Se è ancora vivo mando l'interrupt
            if(q.isAlive()) q.interrupt();
    
    }
    
    public void ferma() { flag = false; }
    Nel ThreadCompute il codice sarà questo:
    codice:
    public class ThreadCompute {
       private ThreadPrincipale tp;
       public ThreadCompute(ThreadPrincipale tp) { this.tp = tp; }
    
       public void run() {
          ... // La tua elaborazione
          // Ultima riga del metodo run()
          tp.ferma();
       }
    }
    In questo modo se il ThreadCompu ha finito la sua elaborazione, ferma anche il thread principale, altrimenti sarà il thread principale a fermare ThreadCompu.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    18
    Perfetto!

    Ci stavo appena "ronzando" pure io in qualkosa di simile
    codice:
    int i=0;
    while(i<this.timer && q.isAlive()){
      try {
        sleep(10);
      } catch (InterruptedException e) {
                
      }
    }
    if(q.isAlive()) q.interrupt();
    ....
    Cmq adotterò la tua soluzione (mi piace di più )

    Grazie mille per l'aiuto!!!

    Ciao

    -=Bellio=-

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.