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

 Java Discussion :

temps d'execution très long ? plantage?


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2019
    Messages : 10
    Par défaut temps d'execution très long ? plantage?
    Bonjour, débutant en Java dans le cadre de mes études, nous devon réaliser un projet de codage/décodage de texte (entre autre) dans une image en modifiant le bit de point faible.

    Le codage fonctionne mais le décodage me pose problème. Lorsque je test la méthode à partir de l'interface graphique, il ne se passe rien et l'interface plante sévèrement (il ne répond plus) alors que java continue de s’exécuter sans problème et je n'arrive pas à comprendre pourquoi (d'autant plus que je suis obligé d'interrompre le run et que je n'ai pas de message d'erreur).

    j'ai un interface graphique qui appel la méthode de décodage de la manière suivante

    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
      private void jComboBox3ActionPerformed(java.awt.event.ActionEvent evt) {                                           
            if(evt.getSource()==jComboBox3){
                String event = (String)jComboBox3.getSelectedItem();
                BufferedImage image = null;
                try {
                  image = ImageIO.read(new File(jTextField1.getText()+".png"));
                } catch (IOException ex) {
                    Logger.getLogger(Interface.class.getName()).log(Level.SEVERE, null, ex);
                }
                MatricePixels test = new MatricePixels(image);
     
            switch (event){
     
                    case "trouver texte caché" :
                    String message = test.extraireTexteCaché(image);
    //                jTextArea1.setText("coucou");
                    jTextArea2.setText(message);
                         break;
    ladite méthode est la suivante :

    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
     public String extraireTexteCaché(BufferedImage image) { // fait planter le bazar ?
            int tableauLigne[];
            tableauLigne = new int[hauteur*largeur]; // on remet les pixels sous forme
            //d'un unique tableau en une ligne pour éviter les problèmes de caractères cachés sur plusieurs ligne
                 for (int j = 0; j < hauteur; j++) {
                    for (int i = 0; i < largeur; i++) {
                    tableauLigne[i]= tabImage[i][j];
    //                System.out.println(tableauLigne[i]);
                    }
                 }
                  String message = "";   
                  int lettre = 0;
               for(int a=0; a<tableauLigne.length;a++){
                   for(int b=0; b<8;b++){
                       int dernier = tableauLigne[a]&1;
                       lettre = lettre*2 + dernier;// décalage des bits déja inérés vers la gauche et ajout du bit extrait
                   }
               message =message+(char)lettre;
               }
     
    return message;    
      }
    avec hauteur et largeur la hauteur et la largeur de la Buffered image (getHigh etc) et tabImage une matrice regroupant les pixels de l'image de la façon suivante (tout ceci en variables globales)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    this.tabImage = new int[largeur][hauteur];
            for (int j = 0; j < this.hauteur; j++) {
                for (int i = 0; i < this.largeur; i++) {
                    this.tabImage[i][j] = image.getRGB(i, j);
                }
            }
    merci pour votre aide !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il ne faut pas faire de traitement long sur le thread de Swing (appelé Event Dispatch Thread, ou EDT) : le principe est que ce thread est régulièrement réveillé par Swing pour réaliser les opération de mise à jour de l'affichage et les traitements des événements. Un thread ne pouvant faire qu'une seule chose à la fois, tant que le code qu'on veut qu'il fasse (par exemple celui fait dans une méthode actionPerformed d'un bouton, il ne peut y avoir ni rafraîchissement de l'interface, ni traitement d’événement, et donc l'interface est figée. Je parle ici de Swing, mais la plupart des systèmes d'interfaces graphiques utilisent un système similaire.

    Pour résoudre cette problématique en Swing, on utilise un SwingWorker, qui va avoir son propre thread pour les traitements longs et proposent des méthodes qui vont permettre de publier des mises à jours qui pourront être répercutées pour mettre à jour l'affichage. En cherchant sur le forum, tu pourras trouver de nombreux exemples, comme celui-là par exemple.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2019
    Messages : 10
    Par défaut
    Okey, merci, je vais aller voir comment fonctionne ce SwingWorker.
    Mais quit à traiter le problème à la source, saurais tu me dire pourquoi ça prend tant de temps ? J'ai pourtant d'autres méthodes un peu sur le même principe qui sont, à priori, plus ou moins instantanées

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hasarddeux Voir le message
    , saurais tu me dire pourquoi ça prend tant de temps ?
    Difficile de faire autre chose que des suppositions sans avoir de données et tout le code (par exemple, je ne sais pas ce que fait MatricePixels test = new MatricePixels(image);), mais déjà les boucles (largeur × hauteur) peuvent être particulièrement lentes si les images sont énormes (genre du 4 millions de pixels sur 4 millions). Faudrait faire du profilage pour voir exactement les points qui prennent du temps.
    En regardant rapidement, je vois bien un ou deux trucs qui peuvent être améliorés, comme :

    • message =message+(char)lettre;utiliser plutôt un StringBuilder. Sur des petits messages, on ne verra pas de différence, mais sur des textes assez grand, ça sera remarquable
    • faire le transfert des pixels de l'image vers le tableau en utilisant les rasters au lieu de parcourir les tableaux, voire utiliser un accès indexé qui simule un accès en ligne sur un raster 2D, plutôt que de faire un transfert (on gagne en plus en mémoire).


    A part ça, le code suivant me semble douteux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public String extraireTexteCaché(BufferedImage image) { // fait planter le bazar ?
            int tableauLigne[];
            tableauLigne = new int[hauteur*largeur]; // on remet les pixels sous forme
            //d'un unique tableau en une ligne pour éviter les problèmes de caractères cachés sur plusieurs ligne
                 for (int j = 0; j < hauteur; j++) {
                    for (int i = 0; i < largeur; i++) {
                    tableauLigne[i]= tabImage[i][j];
    On passe image en paramètre, mais on s'en sert pas. On utilise tabImage à la place, mais je ne vois où il est initialisé. On ne remplit jamais que le début du tableau (les 'largeur' premiers éléments) , mais ensuite après, on traite bien le tableau tableauLigne en entier.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2019
    Messages : 10
    Par défaut
    Ah oui, en effet, merci, je vais reprendre ça....

    pour les méthodes d'optimisation, je vais garder ça sous le coude pour une amélioration perso pendant ces vacances par ce que c'est des fonctions jamais vue en cours et...StringBuilder, j'avais déjà commencé à faire un truc avec mais le prof m'a dit en substance "j'connais pas, utilise pas".

    Du coups je vais me contenter d'explorer les Stringworkers, merci pour l'aide ! (et je passe le sujet en résolu )

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

Discussions similaires

  1. Temps d'execution très lent
    Par bahiatoon dans le forum C++Builder
    Réponses: 16
    Dernier message: 19/07/2007, 23h45
  2. temps d'exécution très long
    Par Adam_01 dans le forum C#
    Réponses: 18
    Dernier message: 22/06/2007, 09h37
  3. Temps d'execution trop long !
    Par taisherg dans le forum Access
    Réponses: 14
    Dernier message: 15/06/2007, 13h22
  4. Temps d'affichage très long
    Par linar009 dans le forum PostgreSQL
    Réponses: 38
    Dernier message: 14/08/2006, 10h00
  5. [SQL] temps d'execution aléatoirement long...
    Par borisa dans le forum Access
    Réponses: 6
    Dernier message: 10/04/2006, 16h17

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