Matlab GUI break while loop behavior change
2 次查看(过去 30 天)
显示 更早的评论
Hello Everyone,
I have a quick question. We have some Matlab code in the lab that we've been using for many years now, but only suddenly have we started having problems. It is basically a gui that scrolls through frames of a video where users can annotate animal behavior. The code was written on Matlab 2014 and still works fine on that version. We've noticed that in both Matlab 2016 and Matlab 2017, it no longer works. Prior to the update, when students would press a gui button, the callback function would break a while loop and pause the video. This was in Matlab 2014. So it's as if even the code was executing a while loop, it would still listen for callbacks. Now in Matlab 2016 and Matlab 2017, it waits for the while loop to entirely complete before responding to the call back. Is this normal and is there a way I can change this behavior? Thank you. I've attached the part of the code that contains the callback and the while loop. I'm not sure if it will help.
Quentin
% --- Executes on button press in playButton.
function playButton_Callback(hObject, eventdata, handles)
% hObject handle to playButton (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of playButton
global microMovie;
global gray_mean_frame;
global trx;
global frameSize;
set(handles.previous,'Enable','off');
set(handles.next,'Enable','off');
set(handles.accept,'Enable','off');
set(handles.decline,'Enable','off');
color_matrix = [1 0 1; 0 1 0; 1 1 0; 0 1 1; 0 0 1; 1 0 0; 0 1 0; 1 0 1; 1 1 1; 0 0 0;.5 .5 .5];
playButtonStatus = get(hObject,'Value');
if playButtonStatus == 0
set(handles.playButton, 'String', 'Play');
elseif playButtonStatus == 1
set(handles.playButton, 'String', 'Pause');
frameNumber = str2double(get(handles.inputFrameNumber,'String'));
while playButtonStatus == 1 && frameNumber <= trx(1).nframes
tic;
playButtonStatus = get(hObject,'Value');
switch get(get(handles.playBackSpeedGroup,'SelectedObject'),'Tag');
case 'One_Ex', frameSkip = 1;
case 'Two_Ex', frameSkip = 2;
case 'Five_Ex', frameSkip = 5;
case 'Ten_Ex', frameSkip = 10;
case 'TwentyFive_Ex', frameSkip = 25;
case 'Fifty_Ex', frameSkip = 50;
end
movieFrame = gray_mean_frame;
%linearInd = microMovie(:,1,frameNumber) + (microMovie(:,2,frameNumber)-1)*frameSize(1);
linearInd = sub2ind(frameSize,microMovie(:,1,frameNumber),microMovie(:,2,frameNumber));
movieFrame(linearInd) = microMovie(:,3,frameNumber);
axes(handles.frameAxis);
cla;
imshow(movieFrame);
for i = 1:size(trx,2)
hold on; plot(trx(i).head_x(frameNumber), trx(i).head_y(frameNumber), 'o', 'color', color_matrix(i,:));
hold on; plot(trx(i).xwingl(frameNumber), trx(i).ywingl(frameNumber), '.', 'color', color_matrix(i,:));
hold on; plot(trx(i).xwingr(frameNumber), trx(i).ywingr(frameNumber), '.', 'color', color_matrix(i,:));
hold on; ellipse(2 * trx(i).a(frameNumber), 2 * trx(i).b(frameNumber), ...
trx(i).theta(frameNumber), trx(i).x(frameNumber), trx(i).y(frameNumber), color_matrix(i,:));
end
frameNumber = frameNumber + frameSkip;
set(handles.inputFrameNumber, 'String', num2str(frameNumber));
set(handles.frameNumberSlider,'Value', frameNumber);
if frameSkip == 1 || frameSkip == 2 || frameSkip == 5 || frameSkip == 10
elapsedTime = toc;
pause(.033/frameSkip - elapsedTime);
elseif frameSkip == 25 || frameSkip == 50
frameNumber = frameNumber + frameSkip - 1;
end
end
end
0 个评论
采纳的回答
Jan
2018-6-27
编辑:Jan
2018-6-27
Try to insert a drawnow.
By the way:
axes(handles.frameAxis);
cla;
imshow(movieFrame);
This is inefficient. Faster:
imgH = gobject(0); % before the loop
handles.frameAxis.NextPlot = 'add';
...
if isempty(imgH)
imgH = imshow(movieFrame);
else
imgH.CData = movieFrame;
end
It is much cheaper to replace the CData of an existing image instead of deleting and recreating the image.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Migrate GUIDE Apps 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!