2013-01-15 163 views
1

編輯:我改寫了一下我的問題,因爲我現在對問題有了更好的理解,第一稿中有很多不必要的信息。MATLAB GUI停止按鈕問題

我正在創建一個獨立的MATLAB應用程序,它需要一個可以啓動和停止循環腳本的切換按鈕。

在此基礎上helpful video,我能夠實現我的gui.m文件這樣的想法是這樣的:

function startBtn_Callback(hObject, eventdata, handles) 

    if get(handles.startBtn,'Value') 
     set(handles.startBtn,'String','Stop Recording'); 
    else 
     set(handles.startBtn,'String','Start Recording'); 
    end 

    while get(handles.startBtn,'Value'); 
     disp('looping..'); 
     pause(.5); 
    end 

這個腳本工作正常,但是當我更換while循環功能的內容我想循環,按鈕停止工作。它在我按下時仍然會切換,但只有在第一次按下按鈕時纔會調用回調。這是我的最終代碼的樣子:

function startBtn_Callback(hObject, eventdata, handles) 

    if get(handles.startBtn,'Value') 
     set(handles.startBtn,'String','Stop Recording'); 
     pause(.1); 
    else 
     set(handles.startBtn,'String','Start Recording'); 
     disp('Recording Stopped') 
    end 

    while get(handles.startBtn,'Value'); 
     myFunction(); 
    end 

當我按下開始按鈕時,此回調運行,循環開始。需要pause(.1)才能更改文本 - 如果我不包含暫停,循環將啓動,但按鈕上的文本不會更改。

之後,沒有後續的按鈕推動任何事情。該按鈕在GUI上切換,但startBtn_Callback永遠不會被調用,並且循環無限期地運行。這是一個問題,因爲我的最終用戶將無法訪問MATLAB控制檯。

爲了給我更多關於我的功能的信息:它記錄音頻5秒鐘,做一些處理,然後輸出一些圖形的方法。我希望這個循環能夠無限地重複,直到用戶停止。

我認爲問題是MATLAB似乎一次只能運行一個函數,所以當myFunction()運行時,回調無法啓動。它在第一個例子中工作的原因是因爲循環調用之間存在暫停。我不能有這樣的停頓,因爲項目的要求是記錄每一秒鐘。

如何爲此過程製作可靠的停止按鈕?

我正在運行MATLAB R2012b 32位。

回答

0

的DrawNow()是我一直在尋找的功能。把這個放在myFunction()之後,強制Matlab在繼續循環之前處理任何疊加的GUI調用。

此代碼創建一個可靠的開始/停止切換按鈕無限期和持續的過程:

function startBtn_Callback(hObject, eventdata, handles) 

    if get(handles.startBtn,'Value') 
     set(handles.startBtn,'String','Stop'); 
     drawnow(); 
    else 
     set(handles.startBtn,'String','Start'); 
    end 
    while get(handles.startBtn,'Value'); 
     myFunction(); 
     drawnow() 
    end 
2

在您的代碼段

a=get(handles.startBtn,'Value') 
while a 
    myFunction(); 
end 

a值分配一次,永遠不會改變之後。因此,將永遠不會運行,否則它將永遠循環。

while get(handles.startBtn,'Value') 
    myFunction(); 
end 

將在每次迭代查詢按鈕的價值,但是,特別是如果myFunction並不需要很長時間來執行,會有很多很多的Java請求,可能使你的GUI呆滯。

這就是您遵循的示例使用pause行的原因,因此循環僅執行每隔0.5秒左右。

如果你不希望有在while直插查詢,則可以選擇寫

%# read inital value of a 
a=get(handles.startBtn,'Value'); 
while a 
    myFunction(); 
    %# update a 
    a=get(handles.startBtn,'Value'); 
end 
+0

好的,我明白了這個問題。當我把查詢放回while行並在循環中更新a時,評估值爲0 ..爲什麼循環甚至運行? get查詢在while行中返回1,在a =行中返回0。 – Cbas

+0

Nvm,在值更改之前啓動循環。在這種情況下循環沒有再次運行。儘管如此,仍然沒有解決主要問題,現在,由於某種未知的原因,我無法重新創建停止腳本運行的情況。 – Cbas