2014-10-11 21 views
2

我一直有同樣的問題,我真的很想知道是否有解決方案。如果我這樣做:當退出圖形時高效地斷開循環M​​atlab

figure 
axis([-2 2 -2 2]) 
a=1; 
h=rectangle('Position',[1,0,0.1,0.1]); 
t=0; 
while a==1 
if ishandle(h) 
t=t+0.1; 
pause(0.001) 
x=0.2*cos(t); 
y=0.2*sin(t); 
set(h, 'Position', [x, y,0.1,0.1]) 
else 
break 
end 
end 

我總是得到某種錯誤時,這個數字與X鍵退出:

Error using handle.handle/set 
Invalid or deleted object. 

這並不奇怪,因爲如果我退出,而其閱讀循環,它仍然必須在它意識到它應該被打破之前通過它。解決錯誤的一種方法是在我使用循環外部使用的東西的地方添加「if ishandle(h)」。但是,這不僅會在幾乎每一行都發送if/end的代碼,而且退出代碼的速度也很慢。這是一個更大的問題,我不介意那麼多錯誤,或者說我的代碼被垃圾郵件發送,但是每當我退出時,我需要等待另外5秒,因爲某些原因Matlab死機。

這是正常的嗎?有沒有更有效的方式來關閉一個數字?我認爲必須有一個聽衆,當x按鈕被點擊時,這隻會阻止一切...

這是非常令人沮喪的,讓我生氣,任何幫助將不勝感激。

謝謝

邁克

+1

我使用try set(h,..)捕獲中斷結束,它工作正常,但它可能被認爲是醜陋的。還有什麼幫助的是隻把語句放在ishandle()之後,其餘的在 – MeMyselfAndI 2014-10-11 07:10:08

回答

3

你得到的錯誤系統,因爲你的時間是錯誤的。您檢查是否存在句柄,然後引入您的1ms延遲(pause(0.001)),最後更新對象。循環中的所有這些短代碼都執行得相當迅速,在延遲期間窗口的實際「關閉」有99.99%的機會發生。

如果你簡單地重新排列你的代碼(地方手柄檢查的延遲之後(最好是剛更新的對象)之前,該代碼將運行良好,你只會得到一個錯誤的奇0.01%當實際的「關閉」將採取檢查和對象更新之間發生。

while a==1 
     t=t+0.1; 
     pause(0.001) 
     x=0.2*cos(t); 
     y=0.2*sin(t); 
    if ishandle(h) 
     set(h, 'Position', [x, y,0.1,0.1]) 
    else 
     break 
    end 
end 

請注意,您的變量a總是1所以退出循環的唯一原因是對象h的刪除時間。所以你可以簡化你的循環:

while ishandle(h) 
     set(h, 'Position', [x, y,0.1,0.1]) 
     t=t+0.1; 
     x=0.2*cos(t); 
     y=0.2*sin(t); 
     pause(0.001) 
end 

只要確保您的延遲不在檢查句柄和更新對象之間。


這應該照顧你的例子中的情況。如果您的實際代碼更大,請考慮在figure properties中使用CloseRequestFcn。這是你問的聽衆。

這個方法可能被認爲比上面的技巧更「乾淨」,但它會涉及在基礎工作區和圖形回調之間傳遞參數,如果你問我,這不是那麼幹淨。對於代碼屬於gui並且不從基本工作區中的腳本執行的情況,最好保留此方法。

雖然我不推薦這樣一個簡單的例子,一個例子是:

hfig = figure('CloseRequestFcn', 'evalin(''base'', ''figExist=0'')') ; 
figExist = 1 ; 
axis([-2 2 -2 2]) 
a=1; 
h=rectangle('Position',[1,0,0.1,0.1]); 
t=0; 
while figExist 
     set(h, 'Position', [x, y,0.1,0.1]) 
     t=t+0.1; 
     x=0.2*cos(t); 
     y=0.2*sin(t); 
     pause(0.001) 
end 
delete(hfig) %// now we have to manually delete the figure 

對於任何更復雜的,你會寫一個單獨的函數將被調用時,這個數字被關閉。

+0

之前,謝謝你,很好的回答。 – 2014-10-11 18:21:06

+0

@MikeNelson。很高興我能幫上忙。考慮「接受」答案,如果它解決了你的問題;) – Hoki 2014-10-11 18:29:14