2016-05-21 15 views
0

Ich entwickle derzeit eine GUI für MATLAB, die mit einer (relativ) hohen Frequenz aktualisiert wird. Es enthält 3 Achsen und eine Reihe von Kontrollkästchen. In jeder Iteration verwende ich den Befehl drawnow, um alles zu aktualisieren - was gut und schön funktioniert.Update spezifisches Objekt in Matlab GUI

Etwas mehr Hintergrund: die GUI wird vollständig über Skript gesteuert. Ich benutze Handler, um die Informationen zu bekommen, die ich brauche.

Das Problem: Ich habe Probleme mit der Leistung. Ich bin jetzt auf der Suche nach einer Möglichkeit, nur den Status der Checkbox zu aktualisieren, aber alles andere unberührt lassen. Momentan kann ich einen geänderten Checkbox-Status nicht zurücklesen, ohne drawnow zu verwenden - und ich kann nichts über das Aktualisieren bestimmter Objekte finden.

+0

Es sollte nicht nötig sein, 'drawnow' zu verwenden. Sie müssen viel mehr Informationen geben, damit Ihnen jemand helfen kann - idealerweise ein Arbeitscode, der den Engpass zeigt, den Sie haben. –

+0

@ nirvana-msu 'drawnow' ist hier notwendig, um die Callback-Queue zu löschen. – Suever

+0

@Sie sollte es nicht beeinflussen _querying_ uicontrol checkbox status. True, der Callback wurde vielleicht nicht verarbeitet, aber OP scheint kein Problem mit –

Antwort

2

Leider gibt es keine Möglichkeit, die Ereignis-/Rückruf-Warteschlange zu leeren, ohne die Grafiken zu rendern, nur umgekehrt. Es gibt auch keine Möglichkeit, die Ereignis-/Rückrufwarteschlange für ein bestimmtes Grafikobjekt zu leeren, das für die Aktualisierung der Value-Eigenschaft der uicontrol erforderlich ist.

Was können Sie zwar tun, ist eher als die Vanille drawnow verwenden, sollten Sie die limitrate Eingang drawnow verwendet, die dafür sorgt, dass, wenn Sie Ihre Plots bei einer sehr hohen Frequenz aktualisieren, sind sie eigentlich nur bei maximal 20 gemacht Bilder pro Sekunde. Dies verhindert, dass Sie aufgrund der Renderereignisse eine signifikante Verzögerung haben.

drawnow limitrate 

Aus der Dokumentation:

drawnow limitrate begrenzt die Anzahl der Updates zu 20 Bildern pro Sekunde. Wenn seit der letzten Aktualisierung weniger als 50 Millisekunden vergangen sind oder wenn der Grafikrenderer mit der vorherigen Änderung beschäftigt ist, verwirft bownow die neuen Aktualisierungen. Verwenden Sie diesen Befehl, wenn Sie Grafikobjekte in einer Schleife aktualisieren und nicht jedes Update auf dem Bildschirm anzeigen müssen. Das Überspringen von Updates kann schnellere Animationen erzeugen. Ausstehende Rückrufe werden verarbeitet, sodass Sie während Animationen mit Figuren interagieren können.

Und als Beispiel:

hcheck = uicontrol('style', 'check', 'String', 'Green'); 
hplot = plot(rand(10,1)); 
set(gca, 'ylim', [0 1], 'xlim', [1 10]) 

originalColor = get(hplot, 'Color'); 

while true 
    set(hplot, 'YData', rand(10,1)) 

    if get(hcheck, 'value') 
     set(hplot, 'Color', 'g') 
    else 
     set(hplot, 'Color', originalColor) 
    end 

    drawnow limitrate 
end 

enter image description here

Ausführen dieses Beispiel auf meinem Mac, ohne die limitrate Option, ich war pro Sekunde Schleife durch die while Schleife etwa 42 mal der Lage . Mit der aktivierten Option limitrate konnte ich 767 Mal pro Sekunde durchlaufen.

1

Sie könnten mit reinen Schwungkomponenten wie JCheckBox besser dran sein. Sie haben keine Probleme wie uicontrols. Versuchen Sie das folgende Beispiel ausgeführt wird und Sie werden sehen, dass Sie können Abfrage neue Checkbox Zustand direkt nach dem er sich verändert, ohne drawnow zu verwenden:

figure(); 
jCB = javaObjectEDT(javax.swing.JCheckBox('Green',0)); 
javacomponent(jCB, [20, 20, 60, 20], gcf); 
pause(0.1); 

while true 
    plot(1); % just some random code 
    display(jCB.isSelected()); 
end 

So brauchen Sie nicht unbedingt spülen Warteschlange die sogar zu Abfrage des aktualisierten Grafikzustands