Cannot break the while loop due to imagedatastore

3 次查看(过去 30 天)
Hi all,
I have build a simple app (appdesigner) which looks for new images in specific network storage and processess the data.
Since I am doing the searching for new files in a while loop I wand to be able to break when a stop button is pushed. The code looks following:
The issue I have is that the code works well till I add the dir_content2 in a while loop. Since then I cannot close the app other way than ctrl+C.
It looks that using imagaDatastore object to check the directory content is the issue. Any ideas what is happening?
EDIT: I found that when I use pause(0.1) at the end of the loop, it is possible to do do the break.
properties (Access = public)
stop_sim = false;
modelName;
model;
net;
anchors;
classNames;
executionEnvironment;
folder;
dir_content;
filenames;
current_files;
DB_address;
DB_port;
tablename;
conn;
StopValue;
end
methods (Access = private)
function stopSimulation(app)
app.stop_sim = true;
msgbox('Application stopped');
app.delete;
end
function startSimulation(app)
i = 0;
ExitCount = 1;
% i=0;
counter = 1;
while i<=1000000 && app.stop_sim == false
i = i +1;
counter = 1;
counter = counter+1;
dir_content2 = imageDatastore(app.folder, "IncludeSubfolders",true);
%% processing parth goes here
end
end
end
% Callbacks that handle component events
methods (Access = private)
% Button pushed function: StartButton
function StartButtonPushed(app, event)
app.status.Value = ('loading data');
app.StopValue = 0;
app.ImageAxes.Visible = 'off';
app.ImageAxes.Colormap = gray(256);
axis(app.ImageAxes, 'image');
%% YOLO model
%% configuration
%#exclude appconfig.txt
Config = fileread('appconfig.txt')
config = split(Config);
app.status.Value = ('waiting for new files');
app.folder = config{3};
app.DB_address = string(config{6});
DBport = config{9};
app.DB_port = str2double(DBport);
app.dir_content = imageDatastore(app.folder,"IncludeSubfolders",true);
app.filenames = app.dir_content.Files;
app.current_files = app.filenames;
%% database;
startSimulation(app)
end
% Button pushed function: StopButton
function StopButtonPushed(app, event)
stopSimulation(app)
end
end
% Component initialization
methods (Access = private)
% App creation and deletion
methods (Access = public)
% Construct app
function app = IMAD_app_07
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end

采纳的回答

Adam Drake
Adam Drake 2023-3-14
编辑:Adam Drake 2023-3-14
What is the purpose of your while loop? I would suggest using a for loop instead of a counter OR flag app.stop_sim programatically whenever you finish processing. If you store all of the images in your directory, there's no need to do it again, much less 10000000 times.
% Example
imds = imageDatastore(app.folder, "IncludeSubfolders",true);
for i = 1:length(imds)
img = readimage(imds,i)
end
  3 个评论
Adam Drake
Adam Drake 2023-3-14
Your RAM consumption is because you're reading every image in your directory 1000000 times.
  1. An image is added to your directory.
  2. You store it.
  3. You do processing.
Now you loop back regardless of if another image was produced and read it again. When another image is added to the directory, you're now storing 2 images everytime. This is not efficient coding. You need to have a function run processing whenever an image is added to the directory and only store that one image. You need to look at appending to the imageDatastore object when a new image is added to the directory.
To detect when a new image is added to the directory SEE https://www.mathworks.com/matlabcentral/answers/18232-detect-new-file-in-a-directory
If I have answered your question, please Accept. Thanks!
Marcin Kowalski
Marcin Kowalski 2023-3-15
Thank you answer.
I replaced imageDatastore with dir and looks more effective in terms of RAM consumption, for sure. To break, pause was needed.

请先登录,再进行评论。

更多回答(0 个)

类别

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

产品


版本

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by