5

Şu anda bir Matlab uygulaması tasarımcı uygulamasında seri bağlantı noktası yoluyla aldığım verileri görüntülemeye çalışıyorum. Lineer göstergelerin (~ 1 Hz) abysmal yenileme oranından ıstırap çekiyorum.Uygulama Tasarımcısı Kullanıcı Arabirimi öğelerinin yenileme hızını artırın

Göstergelerin değerleri, 30 Hz olarak ayarlanmış sabit bir zamanlayıcı tarafından güncellenir. Zamanlayıcı geri çağırmada zaman damgası yazdırması, doğru frekansla çağrıldığını gösterir. Bilgisayarım oldukça etkisiz ve Görev Yöneticisi yüksek yükte herhangi bir ipucu göstermiyor - aslında MATLAB uygulaması neredeyse hiç CPU zamanı tüketmiyor. Aslında sadece göstergeler değil, tüm UI öğeleri.

Tahminimce - veya daha iyisi: benim umudum - yenileme hızında bir miktar sert kapak olması gerekiyor. Ancak resmi belgeler, bunun nasıl değiştirileceğine dair herhangi bir ipucu vermez.

MATLAB sürümüm R2016b'dir.

Benim soru (lar):

  • bu R2017a ile sabit mi? Değilse: bir şey yapabilir miyim, yani MATLAB yerleşik dosyaları ile uğraşabilir miyim?

    classdef testapp < matlab.apps.AppBase 
    
    % Properties that correspond to app components 
    properties (Access = public) 
        UIFigure     matlab.ui.Figure 
        andwatchhowthisstartstospinsmoothlyGaugeLabel matlab.ui.control.Label 
        andwatchhowthisstartstospinsmoothlyGauge matlab.ui.control.SemicircularGauge 
        KeepturninghereKnobLabel matlab.ui.control.Label 
        KeepturninghereKnob  matlab.ui.control.Knob 
    end 
    
    
    properties (Access = private) 
        tim_the_timer 
        i = 0; 
    end 
    
    methods (Access = private) 
        function app = refreshMeter(app, ~,~) 
         % display timestamp 
         datestr(now,'HH:MM:SS.FFF') 
    
         % update the gauge 
         app.andwatchhowthisstartstospinsmoothlyGauge.Value = app.i; 
         app.i = app.i + 1; 
         if app.i > 100 
          app.i = 0; 
         end 
        end 
    end 
    
    
    methods (Access = private) 
    
        % Code that executes after component creation 
        function startupFcn(app) 
         t = timer; 
         t.TimerFcn = @app.refreshMeter; 
         t.Period = 0.02; 
         t.BusyMode = 'drop'; 
         t.ExecutionMode = 'fixedRate'; 
         start(t); 
         app.tim_the_timer = t; 
        end 
    
        % Close request function: UIFigure 
        function UIFigureCloseRequest(app, event) 
         stop(app.tim_the_timer); 
         delete(app.tim_the_timer); 
         delete(app); 
        end 
    end 
    
    % App initialization and construction 
    methods (Access = private) 
    
        % Create UIFigure and components 
        function createComponents(app) 
    
         % Create UIFigure 
         app.UIFigure = uifigure; 
         app.UIFigure.Position = [100 100 640 480]; 
         app.UIFigure.Name = 'UI Figure'; 
         app.UIFigure.CloseRequestFcn = createCallbackFcn(app, @UIFigureCloseRequest, true); 
         setAutoResize(app, app.UIFigure, true) 
    
         % Create andwatchhowthisstartstospinsmoothlyGaugeLabel 
         app.andwatchhowthisstartstospinsmoothlyGaugeLabel = uilabel(app.UIFigure); 
         app.andwatchhowthisstartstospinsmoothlyGaugeLabel.HorizontalAlignment = 'center'; 
         app.andwatchhowthisstartstospinsmoothlyGaugeLabel.Position = [275 138 246 15]; 
         app.andwatchhowthisstartstospinsmoothlyGaugeLabel.Text = '... and watch how this starts to spin smoothly'; 
    
         % Create andwatchhowthisstartstospinsmoothlyGauge 
         app.andwatchhowthisstartstospinsmoothlyGauge = uigauge(app.UIFigure, 'semicircular'); 
         app.andwatchhowthisstartstospinsmoothlyGauge.Position = [338 168 120 65]; 
    
         % Create KeepturninghereKnobLabel 
         app.KeepturninghereKnobLabel = uilabel(app.UIFigure); 
         app.KeepturninghereKnobLabel.HorizontalAlignment = 'center'; 
         app.KeepturninghereKnobLabel.Position = [119 265 112 15]; 
         app.KeepturninghereKnobLabel.Text = 'Keep turning here...'; 
    
         % Create KeepturninghereKnob 
         app.KeepturninghereKnob = uiknob(app.UIFigure, 'continuous'); 
         app.KeepturninghereKnob.Position = [145 314 60 60]; 
        end 
    end 
    
    methods (Access = public) 
    
        % Construct app 
        function app = testapp() 
    
         % Create and configure components 
         createComponents(app) 
    
         % Register the app with App Designer 
         registerApp(app, app.UIFigure) 
    
         % Execute the startup function 
         runStartupFcn(app, @startupFcn) 
    
         if nargout == 0 
          clear app 
         end 
        end 
    
        % Code that executes before app deletion 
        function delete(app) 
    
         % Delete UIFigure when app is deleted 
         delete(app.UIFigure) 
        end 
    end 
    end 
    

    Edit:

Burada konuyu gösteren bir MCV örnek ben topuzu, kaydırıcı açtığınızda göstergesi derhal bir vs. Yani bir şekilde yeteneği güncellenir fark Daha yüksek yenileme oranı kesinlikle var ... ama kontrollere dokunmak zorunda kalmadan nasıl etkinleştirilir? Buna göre MCV güncellendi.

+0

Bu çok ilginç bir problem!Aslında, sanırım "[throttling]" (https://dojotoolkit.org/api/1.10/dojo/throttle.html) "olarak bilinen bir mekanizma yaşıyorsunuz. Güncellemelerin çok sık olduğu zaman sadece başladığı fark ettim. Örnek olarak: Eğer her 0.16s'i güncellemek için ayarlarsanız (MATLAB 2017a'mda) hareket oldukça düzgün. Bunu daha fazla araştırmaya çalışacağım .... –

cevap

1

refreshMeter geri aramadaki drawnow işlevini çağırarak yenilemeyi zorlamanız gerekir.

+0

Cevabınız için teşekkürler. Drawow'u çağırmayı nasıl öneriyorsun? Sadece geri arama kelimesinin eklenmesi benim için bir şey yapmaz, 'çizilmiş güncelleme', 'nocallback', 'pozlama' ... – UnbescholtenerBuerger

+0

Teorik olarak, nereye koyduğunuzu farketmez. düzenli olarak çağırılır. Bunun senin için neden çalışmadığını bilmiyorum üzgünüm. – MrAzzaman

1

senin sorununa yardımcı olmak için aşağıdaki şeyler öneririm:

  1. düşük seviyeli grafik sorunları için MathWorks çözüm sağlar this çok faydalı bağlantıyı takip edin. Grafik kartınızla ilgisi olabilir.

  2. aşağıdaki @MrAzzamans öneri, drawnow ve refreshdata sorununuzu (akılda tutmak farklı çağırma seçeneği var) çözmeye yardımcı olabilir.

  3. GUIDE kullanıyorsanız, Uygulama Tasarımcısı olarak değiştirmeyi deneyin ve sorununuzu çözüp çözmediğini görün.

Iv'e, GUIDE'de bir "video oynatıcı" oluştururken benzer sorunlar yaşadı, ilk öneri benim için düzeltildi.

0

Bu konuda MathWorks desteğiyle bağlantı kurdum. Ne yazık ki, bu durum hem R2016b hem de 2017a'da geçerli olan bilinen bir konu gibi gözüküyor. ,'un gelecekteki sürümlerde düzeltilebileceğini gösteriyor. Destek bana bir geçici çözüm sağlayamadı, bu yüzden ölçüm verisini matlab komut satırına yazdırdığım için.