IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Comment annuler un thread IO en cours d'exécution?


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut Comment annuler un thread IO en cours d'exécution?
    Je ne parviens pas à annuler un Thread d'écriture dans une boucle de fichiers Image.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // ....
    Thread t = new Thread(new Runnable() { public void run() {
           try {
                   for(Iterator writers = ImageIO.getImageWritersByMIMEType(conversion); writers.hasNext();) {
                          ImageWriter w = (ImageWriter)writers.next(); //cache.buffer(w);
                          w.setOutput(ios = new FileImageOutputStream(outputFile)); //cache.buffer(ios);
                          w.write(bimg);
                          w.dispose();
                          ios.close();
                   }
                } catch(IOException ex) { 
                   ex.printStackTrace();        
                   JOptionPane.showMessageDialog(ImageMultiConverter.this, "An unknown error has occured while writing." + ex.getMessage()); }
    }); 
    t.start();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    cancel = new JButton("Cancel");
            cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
                switch(JOptionPane.showConfirmDialog(StatusPane.this, "Cancel all?")) {
                    case JOptionPane.CANCEL_OPTION:
                        break;
                    case JOptionPane.YES_OPTION:
                        synchronized(activeThreads){
                            for(Iterator i = activeThreads.values().iterator(); i.hasNext();) {
                                Thread t = (Thread)i.next();
                                boolean locked = true;
                                while(locked && t.isAlive()) {
                                    try{ 
                                        t.checkAccess(); // l'exception n'est pas levée ???
                                        t.interrupt(); // ici le compilateur passe une fois sans réussir à arreter le thread !
                                        locked = false;
                                    } catch(SecurityException ex) { 
                                        locked = true; 
                                    } 
                                }
                            }
                        }
                        break;
                    default:
                }
            }});
    Quelqu'un a-t-il une solution pour interrompre une écriture en cours sur la sortie fichier?

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Deux solutions :
    • J'ai l'impression que tu écris toute ton image d'un coup. Tu peux l'écrire petit à petit (100 ou 1.000 octets à la fois), et à chaque fois tu testes si ton thread a été interrompu par interrupt. Et s'il a été interrompu, tu arrêtes tranquillement ton écriture.
    • Ou alors, depuis le thread avec JButton, tu fermes sans état d'âme le flux d'écriture de l'image.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  3. #3
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut Jai!
    merci, c'est une bonne solution. MAis je ne trouve pas de méthode d'écriture différente avec ImageIO. par ici la doc donne write(Image) c'est tout.

    Erratum: j'ai trouvé chez JAI un FileChannel que je cherchais. OK!

  4. #4
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    Ouais mais en fait c'est pas idéal... Je n'arrive pas à lancer une instance JAI. Quelqu'un sait-il utiliser cette API?

    A propos de la 2e solution: interrompre un processus I/O (en Anglais)

  5. #5
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    pour stopper un thread tu peux faire un :

    seul problème, tu vas avoir des warning depreciated en fonction de la jdk que tu utilise, mais ca fonctionne très bien.

    Fk

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par STB_Fk
    seul problème, tu vas avoir des warning depreciated en fonction de la jdk que tu utilise, mais ca fonctionne très bien.
    Non non et non ! Si c'est deprecated c'est qu'il y a une raison : en stoppant brutalement ton thread, ton application peut se retrouver dans un état incorrect...


    La solution la plus propre pour stopper un thread est d'utiliser interrupt() et de vérifier sa valeur. Pour les IO il faut passer par NIO et les interruptibles channels, ou bien d'utiliser un filtre qui vérifiera le status du thread. Par exemple pour un OutputStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class InterruptibleOutputStream extends FilterOutputStream {
     
    	public InterruptibleOutputStream(OutputStream out) {
    		super(out);
    	}
     
    	private void checkInterruptibleStatus() throws InterruptedIOException {
    		if (Thread.interrupted()) {
    			throw new InterruptedIOException("Interrupted");
    		}
    	}
     
    	@Override
    	public void write(byte[] b, int off, int len) throws IOException {
    		checkInterruptibleStatus();
    		super.write(b, off, len);
    	}
     
    	@Override
    	public void write(byte[] b) throws IOException {
    		checkInterruptibleStatus();
    		super.write(b);
    	}
     
    	@Override
    	public void write(int b) throws IOException {
    		checkInterruptibleStatus();
    		super.write(b);
    	}
     
    }
    Que tu utilises pour englober ton outputstream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		OutputStream os = new InterruptibleOutputStream(
    				new FileOutputStream("file") );
    		try {
    			// écrire sur le flux !
    		} finally {
    			os.close();
    		}
    a++

  7. #7
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut fix
    juste pour bien confirmer la solution FileChannel de JAI proposée sur une page citée plus haut: il existe bien une classe RandomAccessFile qui renvoie un channel en lecture + écriture compatible avec JAI. merci pour vos réponses!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     try {
                for(Iterator writers = ImageIO.getImageWritersByMIMEType(conversion); writers.hasNext();) {
                   ImageWriter w = (ImageWriter)writers.next(); cache.buffer(w);
                   RandomAccessFile raf = new RandomAccessFile(outputFile, "rws"); cache.buffer(raf);
                   w.setOutput(ios = new FileChannelImageOutputStream(raf.getChannel())); cache.buffer(ios);
                   toggleStep.addActiveStream((Closeable)raf);
                   w.write(bimg);
                   w.dispose();
                   ios.close();
               }
             } catch(IOException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(ImageMultiConverter.this, "An unknown error has occured while writing." + ex.getMessage()); break; }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/06/2011, 15h06
  2. Réponses: 0
    Dernier message: 03/01/2010, 17h47
  3. Comment savoir si un Thread est en cour dexecution?
    Par Soulama dans le forum Langage
    Réponses: 3
    Dernier message: 16/01/2006, 16h48
  4. Comment annuler une opération en cours ?
    Par Sydaze dans le forum Langage
    Réponses: 17
    Dernier message: 16/11/2005, 09h14
  5. comment stoper 1 thread d'arrière-plan
    Par ms91fr dans le forum Langage
    Réponses: 3
    Dernier message: 06/06/2003, 17h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo