How to put a timeout to ginput?

Illustration
Akshat - 2024-06-27T19:24:25+00:00
Question: How to put a timeout to ginput?

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. 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

Expert Answer

Profile picture of John Williams John Williams answered . 2025-11-20

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

 


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!