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

MATLAB Discussion :

Exécution simultanée de deux callback avec pause


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut Exécution simultanée de deux callback avec pause
    Bonjour
    dans une figure matlab, je voudrais faire défiler des images dans deux fenêtres différentes avec un temps aléatoire entre chaque rafraichissement,tout cela géré par deux callback.
    Je sais le faire dans une seule fenêtre avec une pause, mais lorsque le deuxième callback s'exécute, la pause du premier callback est interrompue, pour reprendre lorsque le deuxième callback est terminé.

    Voici un petit exemple illustrant mon problème, j'ai remplacé les images par un chrono. Il faut cliquer sur les deux boutons "go" pour comprendre le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function essai
    clc;close all
    hedit1=uicontrol('style','edit','pos',[10 10 100 20]);
    uicontrol('pos',[120 10 20 20],'string','go','callback','chrono(hedit1)');
    hedit2=uicontrol('style','edit','pos',[10 40 100 20]);
    uicontrol('pos',[120 40 20 20],'string','go','callback','chrono(hedit2)');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function chrono(hedit) %à enregistrer dans un autre fichier
    for k=0:10
        set(hedit,'string',k);
        pause(1);
    end
    Merci pour votre réponse
    PS : j'utilise Matlab version 6.5 sous windows XP

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Tu devrais pouvoir t'en sortir avec deux objets Timer, me semble-t-il ?

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function essai
    clc;close all
    hedit1=uicontrol('style','edit','pos',[10 10 100 20]);
    uicontrol('pos',[120 10 20 20],'string','0','callback',@starttim);
    hedit2=uicontrol('style','edit','pos',[10 40 100 20]);
    uicontrol('pos',[120 40 20 20],'string','0','callback',@starttim);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function starttim(obj,event)
     
    t=timer('TimerFcn',@chrono, 'Period', 1.0,'userdata',obj,...
        'ExecutionMode','fixedrate');
    start(t)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function chrono(obj,event)
     
    h = get(obj,'userdata');
    k = str2num(get(h,'string'))+1;
    set(h,'string',num2str(k))
    C'est pas très propre mais c'est l'idée...

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Ou plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function essai
    clc;close all
    hedit1=uicontrol('style','edit','pos',[10 10 100 20],'tag','h1','string','0');
    uicontrol('pos',[120 10 20 20],'string','go','callback',@starttim,'tag','h1');
    hedit2=uicontrol('style','edit','pos',[10 40 100 20],'tag','h2','string','0');
    uicontrol('pos',[120 40 20 20],'string','go','callback',@starttim,'tag','h2');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function starttim(obj,event)
     
    t=timer('TimerFcn',@chrono, 'Period', 1.0,'userdata',get(obj,'tag'),...
        'ExecutionMode','fixedrate');
    start(t)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function chrono(obj,event)
     
    h = findobj('style','edit','tag',get(obj,'userdata'));
    k = str2num(get(h,'string'))+1;
    set(h,'string',num2str(k))
    Tu peux régler la durée de la pause à partir de la propriété Period des objets Timer

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut Merci et autre question
    Merci beaucoup, je suis en train d'essayer tout ça, c'est effectivement GENIAL et j'ai enfin réussi à résoudre ce type de problèmes.
    Autre question voisine sur la rapidité d'affichage des images. Lorsque je veux afficher une image, elle ne s'affiche pas tant que le programme n'est pas terminé. Par exemple ci-dessous, l'éxécution du programme est simulée par une boucle while, la première image s'affiche en même temps que la seconde alors que j'aurais voulu qu'elle s'affiche tout de suite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    clc;close all
    figure('pos',[10 100 300 300])
    image(rand(100,100)*100)
    tic
    while toc <=5
    end
    figure('pos',[410 100 300 300])
    image(rand(100,100)*100)
    Bravo pour la rapidité et la disponibilité, même en pleine nuit entre dimanche et lundi !!

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Il suffit d'insérer un DRAWNOW :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    clc;close all
    figure('pos',[10 100 300 300])
    image(rand(100,100)*100)
    drawnow
    tic
    while toc <=5
    end
    figure('pos',[410 100 300 300])
    image(rand(100,100)*100)
    Si ça ne marche pas, il est toujours possible d'insérer une légère pause à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    clc;close all
    figure('pos',[10 100 300 300])
    image(rand(100,100)*100)
    pause(.05)
    tic
    while toc <=5
    end
    figure('pos',[410 100 300 300])
    image(rand(100,100)*100)

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/06/2010, 09h04
  2. Exécution de deux fonction avec ie
    Par musicann dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/06/2007, 14h25
  3. [struts] Comparer deux variables avec <logic:equal>
    Par trax020 dans le forum Struts 1
    Réponses: 4
    Dernier message: 29/05/2005, 11h08
  4. UNION de deux SELECT avec nombre d'arguments différents
    Par orus8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/07/2004, 14h32
  5. Script test de deux chaine avec if
    Par kacedda dans le forum Linux
    Réponses: 6
    Dernier message: 02/05/2003, 15h38

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