How to put a timeout to ginput.

7 ビュー (過去 30 日間)
Akshat
Akshat 2024 年 6 月 24 日
編集済み: Akshat 2024 年 6 月 27 日
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

採用された回答

Sudarsanan A K
Sudarsanan A K 2024 年 6 月 25 日
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 件のコメント
Akshat
Akshat 2024 年 6 月 27 日
編集済み: Akshat 2024 年 6 月 27 日
It worked, though i was looking for a one line solution like ginput only, this will do for now I guess. thanks.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeAnnotations についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by