2013-12-17 88 views
2

我試圖創建一個包含主GUI的程序,它可以調用幾個獨立的GUI來顯示不斷更新的「實時」不同數據。但是,似乎只有一個GUI中的圖可以同時更新。同一GUI中的多個軸可以同時更新。但是,如果打開兩個GUI,則一次只能更新一個GUI中的座標軸,而另一個GUI中的座標軸「保持」,直到另一個GUI停止嘗試連續繪圖。在不同的窗口中同時顯示不斷更新圖

作爲這個問題的一個簡單測試,我創建了一個由單軸標記'plotAxes'和一個togglebutton組成的GUI。當切換按鈕是「沮喪」,隨機數據中使用的代碼的軸線連續地繪製:

xData = linspace(1,20,20); 
while(get(hObject,'Value')) 
    yData = rand(20,1); 
    plot(handles.plotAxes,xData,yData); 
    drawnow; 
end 

隨着「gui_Singleton」參數設置爲0,我打開該GUI的兩個實例。如果我切換GUI A開始繪圖,連續隨機數據顯示在軸上。如果我然後切換GUI B進行繪圖,GUI A中的顯示將保留在最後一幀,並且GUI B開始顯示連續的隨機數據。當我取消切換GUI B繪圖按鈕時,GUI A將恢復連續繪圖。

有沒有什麼辦法允許在單獨的GUI窗口中的軸同時更新?我嘗試使用「批處理」命令在單獨的工作人員上運行GUI,但通過「批處理」啓動時不顯示GUI(我懷疑「批處理」不適用於與圖形相關的任何內容)。

回答

1

你需要從一個單獨的線程控制軸:

figure;ax(1) = gca; 
figure;ax(2) = gca; 

while all(ishandle(ax)) 
    plot(ax(1),rand(10,3)); 
    plot(ax(2),rand(10,3)); 
    drawnow 
end 

這將在兩個軸上畫出直到關閉的人物之一。

+0

謝謝。我目前無法對此進行測試,但我明白其中的原因。我認爲可以通過在主GUI中持續運行while循環來修改此過程,以便在多GUI情況下工作,並且只在當前存在的那些軸上繪圖。但是,在第一篇文章中,我忽略了另一個問題:當處於「連續繪圖」狀態時,Matlab中的其他函數也會凍結。例如,輸入命令行的命令在連續繪圖停止之前不會完成其評估。有任何解決這個問題的方法嗎? – user3112939

+0

@ user3112939:你需要使用計時器對象 – Jonas

2

從定時器對象運行繪圖函數。這將使您可以將兩個軸的邏輯分開:每個軸一個定時器。請參閱help timer,並將TimerFcn屬性設置爲在計時器到期時要運行的函數。

for ii=1:2 
    figure; ax(ii) = gca; 
    tim(ii) = timer; 
    tim(ii).ExecutionMode = 'fixedRate'; 
    tim(ii).Period = 0.5; 

    % A timer callback function needs at least two parameters. 
    % x,y are dummy parameters to make the function call happy, 
    % but we will ignore the values 
    tim(ii).TimerFcn = @(x,y)(plot(ax(ii), rand(10,3))); 

    start(tim(ii)); 
end 

編輯: 我忘了提及,定時對象可以被存儲在GUI數據結構,和所述切換按鈕回調只需要啓動和停止計時器。

+1

好主意。這比永久循環更安全,會吞噬你的CPU! – chappjc

+0

謝謝。假設這個工作正常,我認爲這是它應該完成的方式。我不確定爲什麼使用定時器之前沒有發生過。 – user3112939

相關問題