是否有通用的方法来确定Matlab GUI回调函数何时开始然后又返回给调度程序?
我希望在回调运行完成时锁定用户交互,并在回调运行时显示忙状态。在我可以插入此代码的地方是否可以访问调度程序,或者我是否必须将其放入每个回调函数中。
我知道模态 waitbar ,但我想避免尽可能多地使用它。 (他们不能优雅地被杀死。)
答案 0 :(得分:1)
我建议添加一个包装函数,它包装所有原始的UIControl回调函数 包装函数执行以下操作:
您还可以在原始回调之前启动计时器,并在回调返回时停止计时器(计时器可以使用内置于主GUI的图像模拟等待栏[小轴内的图像])。
示例(假设GUI是使用guide
工具创建的):
% --- Executes just before untitled1 is made visible.
function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to untitled1 (see VARARGIN)
% Choose default command line output for untitled1
handles.output = hObject;
%Add wrapper function to each UIControl callback.
A = findall(hObject.Parent, 'Type', 'UIControl');
for i = 1:length(A)
set(A(i), 'Callback', {@wrapper, A(i).Callback});
end
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes untitled1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
function wrapper(ObjH, EventData, origCallback)
disp('Do somthing before callback begins...');
%You can also start a timer.
%Disable all UIControl objects, before executing original callback
A = findall(ObjH.Parent, 'Type', 'UIControl');
for i = 1:length(A)
set(A(i), 'Enable', 'off');
end
%Execute original callback.
feval(origCallback, ObjH, EventData);
disp('Do somthing after callback ends...');
%You can also stop the timer.
%Enable all UIControl objects, after executing original callback
for i = 1:length(A)
set(A(i), 'Enable', 'on');
end
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
pause(1);
set(handles.pushbutton1, 'BackgroundColor', [rand(1,1), rand(1,1), rand(1,1)]);
答案 1 :(得分:0)
您通常可以使用waitfor
命令锁定用户交互。它的设计完全符合您的要求。
您可以让回调函数在完成时更新句柄属性,这可能导致waitfor
退出。如果你正在更新的句柄属性也恰好保持tic / toc
操作的结果计时你的回调函数的持续时间,那么你就会一举两得:)