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

  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)

  7. #7
    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 ok drawnow
    ok merci beaucoup, pause(.05) ou drawnow marchent du tonnerre.

  8. #8
    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 codage de 2 chronos
    Voici mon code pour avoir deux chronos en simultanée, avec possibilité de redémarrage à zéro. Je n'utilise pas les @, je n'ai pas trop compris comment ça marche et même les exemples de l'aide ne fonctionnent pas avec ma version.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    clc;close all;clear all
     
    h1=uicontrol('style','edit','pos',[10 10 100 20]);
    t1=timer('ExecutionMode','FixedRate','period',1,'TimerFcn','set(h1,''string'',i1);i1=i1+1;');
    uicontrol('pos',[120 10 20 20],'string','go','callback','i1=0;demar(t1)');
     
    h2=uicontrol('style','edit','pos',[10 40 100 20]);
    t2=timer('ExecutionMode','FixedRate','period',1,'TimerFcn','set(h2,''string'',i2);i2=i2+1;');
    uicontrol('pos',[120 40 20 20],'string','go','callback','i2=0;demar(t2)');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function demar(t)
    if isequal(get(t,'Running'),'on')
        stop(t)
    end
    start(t)

  9. #9
    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 affichage de deux images avec rafraichissement aléatoire et indépendant
    Voilà enfin le code de mon problème initial, à savoir l'affichage de deux images avec rafraichissement aléatoire et indépendant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    clc;close all;clear all
     
    h1=axes('position',[.1 .1 .35 .35]);
    affiche
    lancer_timer_1
     
    h2=axes('position',[.55 .1 .35 .35]);
    affiche
    lancer_timer_2
     
    load handel %pause musicale :-)
    sound(y,Fs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function lancer_timer_1
    t=timer;
    set(t,'Startdelay',rand*2+1)
    set(t,'TimerFcn','axes(h1);affiche')
    set(t,'StopFcn','clear t;lancer_timer_1')
    start(t)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function lancer_timer_2
    t=timer;
    set(t,'Startdelay',rand*2+1)
    set(t,'TimerFcn','axes(h2);affiche')
    set(t,'StopFcn','clear t;lancer_timer_2')
    start(t)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function affiche
    image(floor(rand(3,3)*100)+1);
    axis off
    J'ai mis beaucoup de temps à trouver un moyen de simuler un timer avec période aléatoire, la période n'étant pas modifiable lorsque le timer est actif, j'ai donc supprimé le timer pour en créer un nouveau dans le callback de fin, avec utilisation de la récursivité.

    Je ne suis pas complètement satisfait :
    - j'ai du programmer deux fonctions quasi-identiques. Il y a sans doute moyen de paramétrer, mais je ne comprends pas vraiment l'utilisation de @.
    - Je n'arrive pas à arrêter mes timers, même en fermant la figure, je suis obligé de quitter Matlab.

    Quelqu'un a une autre solution ?

  10. #10
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Une solution :

    Une seule fonction lancer_timer avec un paramètre d'entrée qui sera 1 ou 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function lancer_timer(param)
    t=timer;
    set(t,'Startdelay',rand*2+1)
    set(t,'TimerFcn',sprintf('axes(h%d);affiche',param));
    set(t,'StopFcn',sprintf('clear t;lancer_timer(%d)',param))
    start(t)
    Pour l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lancer_timer(1);
    %ou
    lancer_timer(2);
    Pas besoin d'utiliser les @ ici.

  11. #11
    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 autre solution
    Ok merci beaucoup, je ne connaissais pas sprintf, mais du coup j'ai pensé a une autre solution avec num2str :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function lancer_timer(param)
    t=timer;
    set(t,'Startdelay',rand*2+1)
    set(t,'TimerFcn',['axes(h',num2str(param),');affiche']);
    set(t,'StopFcn',['clear t;lancer_timer(',num2str(param),')'])
    start(t)

  12. #12
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Oui les 2 solutions se valent.
    Sauf que une petite lecture (même si le titre n'a rien à voir avec ton sujet) de la
    Comment nommer une suite de fichiers : nom_1.ext, nom_2.ext... nom_N.ext ?

    comme la fonction NUM2STR fait appel à SPRINTF, il est généralement plus flexible d'utiliser la solution avec SPRINTF seul

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