Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258

    [java] interrompere ciclo infinito

    salve slave,

    ho fatto un programma in java con una semplice finestra e due bottoni: START e STOP
    quando si preme su START inizia un ciclo che in alcuni casi,
    che non dipendono dal programma, puo' diventare infinito.
    si tratta di un ciclo while che chiama un metodo di una mia classe.

    vorrei sapere se e' possibile interrompere questo ciclo quando si preme su STOP.

    ho provato in vari modi ma non ci sono riuscito. aiuto
    bye bye

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    metti una flag booleana, tipo

    codice:
    ...
    isGoind = true
    ...
    while(isGoind) {
    //fai le cose
    }
    ...
    //quando uno preme stop parte un altro thread che blocca isGoind
    isGoind = false;
    ...
    Potrebbe essere necessario sincronizzare isGoind se ci saranno più thread a contendersi il monitor.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258
    ho provato a mettere un System.exit(0) come azione del bottone.
    se lo premo in un momento qualunque il programma esce ma se
    lo premo metre sta facendo il ciclo infinito non esce piu'.
    non e' strano?
    bye bye

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Originariamente inviato da zaion
    ho provato a mettere un System.exit(0) come azione del bottone.
    se lo premo in un momento qualunque il programma esce ma se
    lo premo metre sta facendo il ciclo infinito non esce piu'.
    non e' strano?
    il ciclo è in un thread differente dal main?
    Tu quando fai start devi far partire un thread che esegui il ciclo, crei una variabile booleana e quando uno preme stopo l'altro thread(quello main) la imposta a false tramite ad esempio un metodo stopCiclo() impostato come synchronized.

    Sennò posta un'pò di codice che vediamo

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258
    Il ciclo e' su un metodo della classe principale (non sul metodo main).

    purtroppo non ho esperienza con e thread.
    come si fa a lanciarne uno?
    bye bye

  6. #6
    Ciao...per lanciare thread a parte c'è una classe specifica...se vuoi ho un programmino che usa 2 thread se vuoi vedere come si fa, l'ho fatto per un esame all'università...cmq per interrompere il ciclo puoi sempre cercare di usare anche il comando break che interrompe un cliclo di botto
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  7. #7
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    la cosa più immediata è fare questo(usare la classe anonima secondo alguni non è elegante, però se la tua classe estende già una JFrame e devi usare tanti thread non devi crearti tante clsssi che estendono thread o tante che implementano Runnable):

    codice:
    public class Classe {
    private Thread ciclo;
    private boolean isGoing;
    
    Classe() {
    
    ciclo = new Thread(new Runnable() {
    public void run() {
    while(isGoing) {
    //ciclo
    }
    }
    });
    
    }
    
    public void startGoind() {
    isGoind = true;
    ciclo.start();
    }
    
    public void synchronized stopGoing() {
    isGoing = false;
    }
    
    }
    non ho provato il concetto è questo, magari dopo bisogna pure usare wait e notity, leggiti una guida che usare i thread al meglio non è semplice soprattutto dal punto di vista della sincronizzazione e della condivisione delle risorse.


    edit:
    sennò fai una bella cosa, fregatene che il metodo stop è deprecato e lo chiami sul thread che contiene il ciclo per fermare tutto.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  8. #8
    beh consiglio di dare una letturina alla documenticazione della classe thread cmq in effetti è un po' un casino poi fare le risorse condivise altrimenti ti crasha tutto...o meglio va tutto in deadlock!! VVoVe:
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

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 © 2025 vBulletin Solutions, Inc. All rights reserved.