Error "Invalid or deleted object." when close a GUI in App Designer

14 次查看(过去 30 天)
Hi, I tried to create an app simply to display capture from a webcam. The main functions are like below.
properties (Access = private)
KeepRunning = 1;
cam = webcam('USB Video Device');
end
methods (Access = private)
% Code that executes after component creation
function startupFcn(app)
app.cam.Resolution = '640x480';
while 1
rgbImage = snapshot(app.cam);
imshow(rgbImage,'Parent',app.UIAxes);
drawnow;
end
end
% Close request function: UIFigure
function UIFigureCloseRequest(app, event)
delete(app.cam)
delete(app)
end
end
Everything works fine; however, as I close the GUI (using X button), this error popped up. Any ideas?
Invalid or deleted object.
Error in app_test/startupFcn (line 23)
rgbImage = snapshot(app.cam);
Error in app_test (line 84)
runStartupFcn(app, @startupFcn)

采纳的回答

Guillaume
Guillaume 2018-7-3
I'm not convinced of the wisdom of having a never ending loop in your startupFcn.
Anyway, the problem is simple when you close the app, your close request callback deletes app.cam making it an invalid handle. Your infinite loop in startupFcn is still running and tries to access the now deleted app.cam, hence the error.
The naive fix would be to change the
while 1
to
while isvalid(app.cam)
99% of the time, it'll fix the error. However, were the user to close the app just after the while has executed but before the snapshot line has executed, you'll still get the error. A foolproof way would be:
while true
try
rgbImage = snapshot(app.cam);
catch
%error occured, probably app.cam was deleted. Quit loop
break;
end
imshow(rgbImage,'Parent',app.UIAxes);
drawnow;
end
  3 个评论
Guillaume
Guillaume 2018-7-4
编辑:Guillaume 2018-7-4
I assume that this error is from the 'catch', right?
I don't think so. I don't know the App Designer enough to say for sure but I suspect that it's because you have that infinite loop in the startup function that you get this error. It's certainly nothing to do with the catch. The code that is causing the error looks like code that should run when the App window is created. However, since you only return from the startup function when the app is closed, that code only runs after the app is destroyed, by which point most objects no longer exist.
Yeah, I'm aware of this but don't know how to fix it
First thing that comes to mind is to use a timer at the same or slightly faster rate than the frame rate of your camera.
Trinh Nguyen
Trinh Nguyen 2018-7-4
I fixed it. I created a public function which includes the view-capture code above. This would avoid the infinite loop in the startup function. Thank you for your help :D

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Develop uifigure-Based Apps 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by