How to put a timeout to ginput.

3 views (last 30 days)
Akshat
Akshat on 24 Jun 2024
Edited: Akshat on 27 Jun 2024
I want to show user a figure, and ask them to click somewhere within a stipulated time limit, like 2 seconds.
I am using ginput as follows, but it seems to be pausing the execution before a button is pressed. I went to check in the ginput function and indeed it was using waitforbuttonpress. I tried some hands in getting a workaround but wasn't much succesfull to interrup ginput (specifically it's wfbp function).
I am attaching a sample code what i need.
I am okay in getting to know some work-arounds, even if they don't use ginput, but i'd still love to know what exactly could ba a solution if I were to use ginput.
Thanks in advanced
x = linspace(0,4*pi,2000);
y=sin(x);
plot(x,y);
timeout=2;
tic;
[xt,yt]=ginput(1);
if toc>2
xt=NaN;
yt=NaN;
end

Accepted Answer

Sudarsanan A K
Sudarsanan A K on 25 Jun 2024
Hi Akshat,
I understand that your goal is to show a figure and ask the user to click somewhere within a stipulated time limit (e.g., 2 seconds). The following approach would enable you achieve this:
  1. Plot the Figure: Plot the figure you wish to show the customer.
  2. Initialize Coordinates: Initialize "xt" and "yt" to "NaN".
  3. Create Click Flag: Create a flag "clicked" to check if the user has clicked.
  4. Create Timer: Create a timer object "t" with a "StartDelay" of "timeout" seconds. Set the "TimerFcn" to "uiresume(gcbf)", which resumes the figure's execution when the timer elapses.
  5. Start Timer: Start the timer with "start(t)".
  6. Set Mouse Click Callback: Set the "WindowButtonDownFcn" to "mouseClickFcn", which sets the "clicked" flag to "true" and resumes the figure's execution when the user clicks.
  7. Wait for User Input or Timeout: Use the "uiwait(gcf, timeout)" function to wait for the figure to be resumed by either the timer or the mouse click.
  8. Clean Up Timer: Stop and delete the timer object with "stop(t)" and "delete(t)".
  9. Check Click Flag: Check if the "clicked" flag is "true" to determine if the user clicked within the timeout period.
  10. Display Coordinates: Print the clicked coordinates to the console.
Here is an example:
timed_example();
function timed_example()
x = linspace(0, 4*pi, 2000);
y = sin(x);
plot(x, y);
timeout = 2;
[xt, yt] = deal(NaN); % Initialize the coordinates
% Create a flag to check if the user has clicked
clicked = false;
% Create a timer object to interrupt the execution after the timeout
t = timer('StartDelay', timeout, 'TimerFcn', @(~,~) uiresume(gcbf));
start(t);
% Set the WindowButtonDownFcn to capture the click and resume the figure
set(gcf, 'WindowButtonDownFcn', @mouseClickFcn);
% Wait for the figure to be resumed by either the timer or the mouse click
uiwait(gcf, timeout);
% Clean up the timer object
stop(t);
delete(t);
% Display the clicked coordinates if clicked within the timeout
if clicked
fprintf('Clicked coordinates: (%f, %f)\n', xt, yt);
else
fprintf('No click detected within the timeout period.\n');
end
function mouseClickFcn(~, ~)
% Capture the coordinates of the click
coords = get(gca, 'CurrentPoint');
xt = coords(1, 1);
yt = coords(1, 2);
clicked = true;
uiresume(gcbf);
end
end
The following resources are useful for further explorations:
I hope this helps!
  1 Comment
Akshat
Akshat on 27 Jun 2024
Edited: Akshat on 27 Jun 2024
It worked, though i was looking for a one line solution like ginput only, this will do for now I guess. thanks.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!