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

Interfaces Graphiques Discussion :

Boucle infini avec while [Débutant]


Sujet :

Interfaces Graphiques

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Par défaut Boucle infini avec while
    Bonjour,

    je suis nouveau et débutant dans l'utilisation de Matlab. J'ai cherché sur votre forum et dans l'aide de Matlab mais je n'ai pas réussi à trouver la réponse à mon problème.

    En fait, l'IHM réalisée me permet de charger des fichiers à l'aide de uigetfile pour ensuite être traités.

    Le problème est que je dois vérifier les extensions de fichiers et le fait que l'utilisateur a charger les fichiers ou non. Pour cela j'utilise une boucle while qui vérifie, à l'aide de flag, que l'utilisateur a bien charger les bon types de fichiers.

    C'est là qu'est mon problème, lorsque l'utilisateur sélectionne les bons types de fichiers cela fonctionne mais lorsque je fait du dysfonctionnel en sélectionnant un ou plusieurs mauvais fichiers ou en ne chargeant rien je rentre dans une boucle infini qui et je suis obliger de stoper Matlab...

    J'ai essayer de mettre un waitfor en début de boucle afin d'attendre un clic sur le bouton qui permet de lancer la vérification mais cela ne fait rien...

    Je vous met une partie du code concerné :
    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
     
        function affich_suivi(varargin)
            % Initialisation des flags de vérification
            flag_nom_mdl = 0; flag_nom_m = 0; flag_nom_xls = 0;
     
     
            while ((flag_nom_mdl ~= 1)||(flag_nom_m ~= 1)||(flag_nom_xls ~= 1))
                %Définition des variables d'entrées
                nom_mdl_entree_ut = get(nom_mdl,'string');
                nom_calib_entree_ut = get(nom_m,'string');
                nom_dico_entree_ut = get(nom_xls,'string');
     
                % Vérification sur le fichier .mdl
                if ((strcmp(nom_mdl_entree_ut,'') == 1)||(strcmp(nom_mdl_entree_ut,num2str(0)) == 1 ))
                    set(commentaire,'String','Veuillez sélectionner le modèle.');
                    flag_nom_mdl = 0; % pas de modèle sélectionné
                else
                    if (strcmp('.mdl',nom_mdl_entree_ut(end-3:end)) == 0)
                        set(commentaire,'String','Veuillez sélectionner le modèle au format .mdl');
                        flag_nom_mdl = 0; % mauvais format pour le modèle
                    else
                        flag_nom_mdl = 1; % modèle sélectionné au bon format
                        set(commentaire,'String','Modèle sélectionné');
                    end
                end
            end
    Il y a 3 "flags" car 3 fichiers à tester. Ce qui se passe c'est que si l'utilisateur ne fait pas les bons choix du premier coup, les flags concernés sont à 0 tout le temps d'où la boucle infini...

    Je voudrais qu'une fois rentré dans cette boucle, il y ait une attente d'un appui sur le bouton de lancement qui est défini comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bouton_lancement = uicontrol('Parent',fond,...
        'Style','Pushbutton',...
        'FontWeight','bold',...
        'String','Lancer la vérification',...
        'Units','normalized',...
        'Position',[.325 .01 .35 .05],...
        'tag','lancement',...
        'Callback',@affich_suivi);
    Les set me permettent d'afficher dans une fenêtre de commentaire pour avoir un suivi de ce qui se passe.

    Si vous pouviez m'indiquer s'il est possible et si oui, m'orienter un peu cela m'aiderait beaucoup!

    Bonne journée et merci par avance

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Bonjour,

    Tu n'as pas besoin d'utiliser une boucle WHILE pour faire ces vérifications. Quel est l'intérêt de cette boucle ici?

    Duf

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Par défaut
    L'intérêt serait de pouvoir relancer effectuer des traitements sur d'autres fichiers sans avoir à relancer mon programme à chaque fois.

    La boucle permet aussi de vérifier que l'utilisateur rentre bien le bon fichier car il pourrait vouloir insister à essayer de rentrer un mauvais fichier...

    Je sais que c'est mal considérer l'utilisateur mais cela m'est demandé par mes chefs dans le cadre de mon stage.

    Il existe une commande particulière qui permet de ne pas faire de boucle?

    Merci.

    Romm1

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le problème, c'est que tu n'inclus pas la demande de changement de fichier dans ta boucle.
    Tu parles de uigetfile, or tu travaille ici avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom_mdl_entree_ut = get(nom_mdl,'string');
    nom_calib_entree_ut = get(nom_m,'string');
    nom_dico_entree_ut = get(nom_xls,'string');
    À ta place, je ferai quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    flag = 1;
    while flag    
        [FileName,PathName] = uigetfile({'*.mdl,'mdl Files (*.mdl)'},'Select the mdl-file');
        if ~FileName
            uiwait(warndlg('Aucun modèle sélectionné'))
        elseif (~strcmp('.mdl',FileName(end-3:end)))
            uiwait(warndlg('Veuillez sélectionner le modèle au format .mdl'))
        else
            flag = 0;
        end
    end
    Et ensuite je placerai les chaines dans les objets de ta figure

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Par défaut
    Ah pardon c'est ma faute je n'ai pas dit que mes uigetfiles étaient utilisés plus tôt dans mon application et je récupère le filename et le pathname dans nom_mdl,...

    Merci pour ton conseil, je vais essayer de l'adapter à mon programme et je vous tiens au courant rapidement.

    Sinon, on m'a expliqué une autre solution qui à l'air de marcher et dont je vous transmettrais le code au cas où.

    Merci beaucoup.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Par défaut
    Hello tout le monde !!
    Je n'ai pas essayé le code que tu m'as fournit Winjerome car il ne correspondait pas au mien et changeait tout la structure de mon IHM.

    En fait, il suffisait de rajouter une msgbox et un uiwait !!
    Mais bon, c'est réglé maintenant!

    Merci pour votre aide!
    Je joins la partie de code qui me posais problème pour ceux qui en aurait besoin

    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
    32
     
        function affich_suivi(varargin)
            % Initialisation des flags de vérification
            flag1 = 0; flag2 = 0; flag3 = 0;
     
            while ((flag1 ~= 1)||(flag2 ~= 1)||(flag3 ~= 1))           
                %Définition des variables d'entrées
                nom_mdl = get(nom_fichier_mdl,'string');
                nom_calib = get(nom_fichier_m,'string');
                nom_dico = get(nom_fichier_xls,'string');
                % Vérification sur le fichier .mdl
                if ((strcmp(nom_mdl,'') == 1)||(strcmp(nom_mdl,num2str(0)) == 1 )) % Test vérifiant la présence d'un fichier
                    set(nom_fichier_mdl,'String',''); % Réinitialisation des champs parcourir
                    set(parcourir_fichier_mdl,'String','...');
                    set(commentaire,'String',str2mat('Veuillez sélectionner le modèle.'));
                    msgbox('Aucun modèle sélectionné');
                    uiwait(msgbox);
                    flag1 = 0; % pas de modèle sélectionné
                else
                    if (strcmp('.mdl',nom_mdl(end-3:end)) == 0) % Test sur l'enxtension du fichier
                        set(nom_fichier_mdl,'String',''); 
                        set(parcourir_fichier_mdl,'String','...');
                        set(commentaire,'String',str2mat('Format erroné pour le modèle'));
                        msgbox('Veuillez renseigner un modèle au format .mdl');
                        uiwait(msgbox);
                        flag1 = 0; % mauvais format pour le modèle
                    else
                        flag1 = 1; % modèle sélectionné au bon format
                    end
                end
            end
        end

  7. #7
    Invité
    Invité(e)
    Par défaut
    Pour commencer,

    remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    msgbox('Veuillez renseigner un modèle au format .mdl')
    uiwait(msgbox);
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uiwait(msgbox('Veuillez renseigner un modèle au format .mdl'));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    msg = msgbox('Veuillez renseigner un modèle au format .mdl');
    uiwait(msg);
    Ensuite, tu as codé de façon à ce que l'utilisateur voit le message contenu dans les msgbox, puis doit changer le texte contenu dans les edits, et enfin appuie sur le bouton OK pour revérifier. Ce qui me semble guère une bonne solution d'interface.

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Par défaut
    Merci pour le conseil pour l'allègement du code !!

    Et sinon pour le msgbox, le fait que le msgbox apparaisse si l'utilisateur à soit annulé, soit rien renseigné, soit renseigné quelquechose de faux, le programme s'arrête tout simplement...

    Je ne sais pas vraiment à quoi cela est due mais bon ça marche et niveau interface cela permet réellement de signaler à l'utilisateur qu'il y a un problème au niveau de la sélection des fichiers.

    En réalité, lorsque la msgbox apparaît l'utilisateur est prévenu visuellement par l'apparition d'une fenêtre, il lui suffit alors de cliquer sur "OK" et de recharger les fichiers correctement cette fois. Si jamais il avait oublié ce qui n'allait pas, le message est répété dans une fenêtre de commentaire et le fichier erroné est effacé au niveau de l'affichage de sélection.

    Surement un peu lourd niveau affichage, ouverture d'une deuxième fenêtre, mais je trouve que cela rend l'outil plus robuste et c'est réellement ce qui est recherché pour mon projet.

    En tout cas, merci beaucoup pour l'aide et les conseils !!

    Romm1

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

Discussions similaires

  1. arrêter une boucle infinie avec DoEvents
    Par 3aychoucha dans le forum C++/CLI
    Réponses: 5
    Dernier message: 31/03/2011, 22h48
  2. [Exchange 2003] Boucle infinie avec l'autoreply
    Par fredpte dans le forum Exchange Server
    Réponses: 0
    Dernier message: 05/05/2010, 14h10
  3. Boucle à l'infini avec While et un Reader
    Par mrocks dans le forum Windows Forms
    Réponses: 5
    Dernier message: 16/06/2009, 17h13
  4. paint() en boucle infinie avec JDesktopPane
    Par Spidy dans le forum Débuter
    Réponses: 6
    Dernier message: 19/03/2009, 17h31
  5. Boucle infini avec exploitation d'un resultset
    Par mithrendil dans le forum JDBC
    Réponses: 5
    Dernier message: 01/02/2008, 17h21

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