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 :

Accélerez l'update des data de plots dans une GUI


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut Accélerez l'update des data de plots dans une GUI
    Bonjour à tous.

    Je conçois actuellement un logiciel avec GUI qui se connecte en TCP à un récepteur numérique et récupère tous les 7ms une trame contenant une cinquantaine de paramètres (modulations, injection, position gps,etc...) sur lesquels j'effectue des calculs (transformation WGS84 => cartésien , algos sur divers paramètres, FFT).

    J'enregistre chaque trame dans un fichier log.

    J'affiche divers courbes sélectionnables. Il y a au total 4 axes contenant chacun 2 courbes(plotyy).
    L'acquisition des data peut durer parfois 45 minutes. Autant dire que le nombre de points à afficher peut atteindre des sommets.

    Je rafraichis l'affichage chaque seconde grace à un timer qui appelle une fonction update_display que voici:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    %%
    % --- Update plot    
    function update_display(obj,event,handles)
     
    global passe params_plot ;
    %Pas à faire varier en fonction du nombre total de point
    params_plot.step_plot=1;
     
        [haxes1,hline11,hline12] = plotyy(handles.axes1,passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.m15(1:params_plot.step_plot:passe.nb_trames),passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.m135(1:params_plot.step_plot:passe.nb_trames));
        if isnan(params_plot.ymax_g_1)
            set(haxes1(1),'YLimMode','auto');
        else
            set(haxes1(1),'ylim',[params_plot.ymin_g_1 params_plot.ymax_g_1]);%,'ytick',[params_plot.ymin_g_1 params_plot.ymax_g_1]);
        end
        if isnan(params_plot.ymax_d_1)
            set(haxes1(2),'YLimMode','auto');
        else
            set(haxes1(2),'ylim',[params_plot.ymin_d_1 params_plot.ymax_d_1]);%,'ytick',[params_plot.ymin_d_1 params_plot.ymax_d_1]);
        end
        set(haxes1(1),'Xgrid','on')
        set(haxes1(1),'Ygrid','on')
        set(haxes1(2),'Xgrid','on')
        set(haxes1(2),'Ygrid','on')
     
        [haxes2,hline21,hline22] = plotyy(handles.axes2,passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.injection(1:params_plot.step_plot:passe.nb_trames),passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.site_ref(1:params_plot.step_plot:passe.nb_trames));
        if isnan(params_plot.ymax_g_2)
            set(haxes2(1),'YLimMode','auto');
        else
            set(haxes2(1),'ylim',[params_plot.ymin_g_2 params_plot.ymax_g_2]);%,'ytick',[params_plot.ymin_g_2 params_plot.ymax_g_1]);
        end
        if isnan(params_plot.ymax_d_2)
            set(haxes2(2),'YLimMode','auto');
        else
            set(haxes2(2),'ylim',[params_plot.ymin_d_2 params_plot.ymax_d_2]);%,'ytick',[params_plot.ymin_d_2 params_plot.ymax_d_2]);
        end
        set(haxes2(1),'Xgrid','on')
        set(haxes2(1),'Ygrid','on')
        set(haxes2(2),'Xgrid','on')
        set(haxes2(2),'Ygrid','on')
        set(handles.axes2,'DrawMode','Fast')
     
        [haxes3,hline31,hline32] = plotyy(handles.axes3,passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.bearing(1:params_plot.step_plot:passe.nb_trames),passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.az_ref(1:params_plot.step_plot:passe.nb_trames));
        if isnan(params_plot.ymax_d_3)
            set(haxes3(2),'YLimMode','auto');
        else
            set(haxes3(2),'ylim',[params_plot.ymin_d_3 params_plot.ymax_d_3]);%,'ytick',[params_plot.ymin_d_3 params_plot.ymax_d_3]);
        end
        if isnan(params_plot.ymax_g_3)
            %set(haxes3(1),'YLimMode','auto
            set(haxes3(1),'ylim',[get(haxes3(2),'ylim')]);
        else
            set(haxes3(1),'ylim',[params_plot.ymin_g_3 params_plot.ymax_g_3]);%,'ytick',[params_plot.ymin_g_3 params_plot.ymax_g_3]);
        end
        set(haxes3(1),'Xgrid','on')
        set(haxes3(1),'Ygrid','on')
        set(haxes3(2),'Xgrid','on')
        set(haxes3(2),'Ygrid','on')
     
        [haxes4,hline41,hline42] = plotyy(handles.axes4,passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.err_rel_mod40_corr(1:params_plot.step_plot:passe.nb_trames),passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.dist_ref(1:params_plot.step_plot:passe.nb_trames));
        if isnan(params_plot.ymax_g_4)
            set(haxes4(1),'YLimMode','auto');
        else
            set(haxes4(1),'ylim',[params_plot.ymin_g_4 params_plot.ymax_g_4]);%,'ytick',[params_plot.ymin_g_4 params_plot.ymax_g_4]);
        end
        if isnan(params_plot.ymax_d_4)
            set(haxes4(2),'YLimMode','auto');
        else
            set(haxes4(2),'ylim',[params_plot.ymin_d_4 params_plot.ymax_d_4]);%,'ytick',[params_plot.ymin_d_4 params_plot.ymax_d_4]);
        end
        set(haxes4(1),'Xgrid','on')
        set(haxes4(1),'Ygrid','on')
        %set(haxes4(2),'Xgrid','on')
        %set(haxes4(2),'Ygrid','on')
    Cette fonction met 25ms à afficher les courbes.

    Existe-t-il un moyen à ma portée de non spécialiste matlab de diminuer ce temps en rafraichissant seulement les points nouvellements calculés au lieu de TOUT réafficher?

    Je vais faire varier le 'pas' des data à afficher en fonction du nombre total de point mais cela ne change rien pour les premières secondes où il n'y a pas beaucoup de points et où on est déjà à 25ms.

    J'ai lu qu'il existait une fonction refreshdata... Peut-elle avoir un intérêt dans mon cas? Je n'ai pas réussi à l'utiliser avec plotyy...

    Merci d'avance pour votre aide!

  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
    Voici l'idée :

    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
    33
    34
    35
    function test
     
    fig = figure('tag', 'myfig');
     
    handles.u = uicontrol('units', 'normalized', 'position', [.05 .05 .1 .1], ...
        'string', 'Click', 'callback', @cb);
     
    guidata(fig, handles);
     
    function cb(obj,event)
     
    h = findobj('type', 'figure', 'tag', 'myfig');
    handles = guidata(h);
     
    for n = 1:40
     
        if isfield(handles, 'line1')
     
            y1 = get(handles.line1, 'YData');
            set(handles.line1, 'XData', 1:n, 'YData', [y1 rand]);
            y2 = get(handles.line2, 'YData');
            set(handles.line2, 'XData', 1:n, 'YData', [y2 10+rand]);
     
            set(handles.axes, 'XLim', [0 n])
     
        else
     
            [handles.axes, handles.line1, handles.line2] = plotyy(1, rand, 1, 10+rand);
            guidata(h, handles);
     
        end
     
        drawnow
     
    end
    Il n'y a en définitive qu'un seul appel à plotyy.

    Sinon, une remarque d'ordre plus générale. Si j'ai bien compris, tu comptes afficher un point toutes les 7 millisecondes pendant 45 minutes.
    Faisons un bref calcul : 45*60*1000/7 soit plus de 385000 points mis côte à côte horizontalement.
    Compare ce chiffre à la définition horizontale en pixels de l'écran sur lequel tu comptes afficher le graphique… vois-tu où je veux en venir ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Merci, je vais regarder ça...
    Ça m'a l'air de convenir parfaitement, cette solution!

    Sinon, tu as tout à fait raison pour l'histoire du nombre de points.
    C'est pour cela que je fais varier le 'pas' en x en fonction du nombre de points déjà calculés pour que le nombre de points à afficher soit constant à 10000.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    params_plot.step_plot=ceil(passe.nb_trames/10000);
    [haxes1,hline11,hline12] = plotyy(handles.axes1,passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.m15(1:params_plot.step_plot:passe.nb_trames),passe.numero_trame(1:params_plot.step_plot:passe.nb_trames),passe.m135(1:params_plot.step_plot:passe.nb_trames));
    C'est beaucoup encore mais j'ai remarqué que la différence de temps de traitement n'est pas flagrante entre 1000 ou 10000...
    Donc autant laisser une marge pour voir certaines irrégularités dans mes courbes. Après, je compte laisser la possibilité de zoomer en cours de mesure.

    Par contre, simple curiosité, cette fonction : refreshdata aurait été utilisable?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Bon, je suis plutôt satisfait!
    Au départ, j'observais le même temps de traitement.
    Puis j'ai tenté d'enlever la ligne 'drawnow' et ça a été divisé par 3!

Discussions similaires

  1. Update des data dans une column varchar2(3 byte)
    Par Kagukuk dans le forum SQL
    Réponses: 4
    Dernier message: 15/11/2011, 15h45
  2. Plot dans une GUI
    Par AsmaHaj dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 20/03/2007, 21h01
  3. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 08/07/2005, 21h56
  4. Comment mettre des lignes de couleur dans une TCheckListBox ?
    Par Isa31 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 31/03/2005, 08h40
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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