Interrupt a while loop with functions if it takes too long

4 views (last 30 days)
I have a while loop containing several functions. If one of these functions takes to long, I want to break it.
All solutions that I found do not work because they check the time not continuely during the execution, but at the end of the functions.
Is there a way of timing the iteration during its execution and break it?
I mean with code, not ctrl-c
  1 Comment
Aquatris
Aquatris on 26 Sep 2024
you can also use a timer to check the execution time and provide warning. I am not sure how you would stop execution of a function within a while loop from timer callback. Maybe another global flag can be used. This community loves global variables (!)
global tStart tMax % global variables so they can be reached from timer callback function
tMax = 4; % seconds
% create timer
t = timer;
t.StartDelay = 1;
t.Period = 2;
t.ExecutionMode = 'fixedRate';
t.TimerFcn = @stopExec;
start(t)
cnt = 0;
% dummy while loop
while cnt >=1
tStart = tic;
myFun1;
tStart = tic;
myFun2;
tStart = tic;
myFun3;
cnt = cnt+1;
end
% timer function that gives error
function stopExec(~,~)
global tStart tMax
if isempty(tStart)
tStart = tic;
end
% create warning when time limit it exceeded
funCallStack = dbstack; % get running function stack
if toc(tStart)>=tMax
warning(sprintf('Exceeded Time Limit! @ %s. \n Time limit: %.2f,Current Execution Time: %.2f ',funCallStack(4).name,tMax,(toc(tStart))))
end
end
% dummy functions called from while loop
function myFun1()
pause(5)
end
function myFun2()
pause(8)
end
function myFun3()
pause(3)
end

Sign in to comment.

Accepted Answer

Torsten
Torsten on 24 Sep 2024
Edited: Torsten on 24 Sep 2024
Is there a way of timing the iteration during its execution and break it?
No. You could go into the function and time certain operations therein. But you always have to wait until the operations are done before getting the chance to stop the code.
  3 Comments
Torsten
Torsten on 24 Sep 2024
Exiting a while loop is usually done by counting the number of times it is executed and exiting if a prescribed maximum number of loops is reached:
nmax = 10;
count = 0;
i = 1;
while count < nmax
i = 2*i;
count = count + 1;
end
i
i = 1024
darwusch darwusch
darwusch darwusch on 24 Sep 2024
No that does not break the iteration during its execution, but after it already finished. That's too late.

Sign in to comment.

More Answers (1)

jwiix
jwiix on 24 Sep 2024
function [outputArg1,outputArg2] = yourFunction()
%YOURFUNCTION Summary of this function goes here
% Detailed explanation goes here
outputArg1 = 1;
outputArg2 = 2;
end
function [outputArg1,outputArg2] = yourFunction2()
%YOURFUNCTION Summary of this function goes here
% Detailed explanation goes here
outputArg1 = 1;
outputArg2 = 2;
wait(10);
end
function result = runWithTimeoutSimplified(func, timeout)
% Create a parallel pool if it doesn't exist
if isempty(gcp('nocreate'))
parpool('local', 1);
end
% Start the function asynchronously
f = parfeval(@() func(), 1);
tic;
a=true;
runFlag=0;
while a
b=toc;
a=b<timeout;
% Wait for the function to complete or timeout
if strcmpi(f.State,'running')
runFlag =1;
else
runFlag=0;
[result] = fetchOutputs(f);
break;
end
end
if runFlag
cancel(f);
disp('Operation cancelled due to timeout')
else
disp(result);
end
end
% Then in console:
>> result = runWithTimeoutSimplified(@yourFunction, 5) % This should pass and display result
>> result = runWithTimeoutSimplified(@yourFunction2, 5) % This will fail and be cancelled after timeout .. in this case 5 seconds

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products


Release

R2024b

Community Treasure Hunt

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

Start Hunting!