想知道如何實現標題中的問題。我有一些從按鈕按下運行的回調。這些回調,如果被數字關閉中斷,將導致錯誤,因爲函數似乎運行,然後被關閉函數關閉數字而中斷,然後在數字關閉後回調似乎恢復。如何防止回撥被圖形的關閉功能中斷?
如果我將按鈕的'Interruptible'
屬性設置爲'on'
,它可以防止其他回調中斷它,但似乎不適用於圖形的關閉功能。我的另一個想法是在圖的'CloseRequestFcn'
回調中指定'closefunction'
,然後在刪除圖之前調用drawnow
來刷新事件隊列,但這不起作用。
對我來說,最後一招是在運行回調時將圖形的'CloseRequestFcn'
設置爲''
,但這看起來很乏味。有沒有一個標準的解決方案來完成這個?
編輯:
從MATLAB的文件:
注意如果中斷回調是DeleteFcn或CreateFcn 回調或人物的CloseRequest或ResizeFcn回調,它 不管中斷值的執行回調該對象的可中斷屬性爲 。中斷回調在下一個drawnow,figure,getframe,pause或waitfor 語句中啓動 執行。圖形的WindowButtonDownFcn回調例程或對象的ButtonDownFcn或回調例程按照上述規則進行處理。
因此,看來是interruptible
屬性不影響關閉功能的情況。
編輯2:
好的,所以我覺得我發現了一個問題。這真是奇怪。其實我從MATLAB文檔是回調只是中斷髮現,如果他們有interruptible
屬性設置爲on
AND:
If there is a drawnow, figure, getframe, waitfor, or pause command in the running callback, then MATLAB executes the interrupting callbacks which are already in the queue and returns to finish execution of the current callback.
我不使用任何的明確這些功能,所以事實證明我的大部分回調不能被closereqfcn
中斷。但是,事實證明有些是,而爲什麼看起來很奇怪。如果有回調:
`大的計算 - > imshow - > imshow
large computation -> set -> set -> set -> set
其中set
命令設置軸visible
屬性爲off
,然後沒有中斷似乎發生,如果我退出回調
現在時,如果我有:
large computation -> imshow -> set -> imshow -> set
如果我在第二個set
命令的回調期間退出,matlab會發出錯誤。另外,如果我有:
large computation -> imshow -> imshow -> set
MATLAB發出一個錯誤,如果第一set
命令的回調過程中我退出。如果我在回調過程中取消
large computation -> imshow -> imshow -> imshow
還發行了第三imshow
錯誤。
由於某種原因,似乎連續撥打兩個imshow
致使我的回調中斷。是否有可能matlab隱式調用drawnow
或做一些奇怪的事情,如果你使用多個imshow
?順便說一句,我的matlab版本是R2009a。
一個解決方法可以在'CloseRequestFcn'可以啓動計時器,並在計時器回調試圖關閉這個數字如果沒有通過檢查**標誌中斷任何重要的回調**('close_allowed'),你當數字不應該被關閉時(例如在重要進程中)設置爲false。 – pm89
在我看來,導致錯誤的實際問題是回調中使用的數據會被刪除。在圖形之外創建所需的數據副本可能是一個想法(無論如何,這是一個很好的做法)。也許用'copyfig'到一個隱藏的窗口,或者只是在回調開始時手動存儲你所需要的。完成後請務必清理乾淨。 – bdecaf
@bdecaf不僅僅如此。有時我必須更新可見的數字軸。如果該回調被圖形關閉中斷,則它會嘗試更新不存在的軸手柄。看起來很奇怪的matlab會這樣做。這似乎使任何回調都可以被數字關閉中斷。如何讓這種行爲更安全? – Justin