How to stop the timer by clicking the button twice in GUI, AND how can I return the number of the time I pause?

6 ビュー (過去 30 日間)
I write a countdown timer and want to stop it by click it twice and return the number on the screen when I stop it?
function [] = timer_examp()
S.fh = figure('units','pixels',...
'position',[500 500 200 100],...
'menubar','none',...
'name','Timer_examp',...
'numbertitle','off',...
'resize','off');
S.tx = uicontrol('style','text',...
'unit','pix',...
'position',[10 60 180 30],...
'fontsize',14,...
'string','60'); % the beggining time was in 60s
S.tmr = timer('Name','Countdown',...
'Period',1,... % 1s update period.
'StartDelay',.01,... % update delay period is 0.01s
'ExecutionMode','fixedSpacing',...
'StopFcn',@deleter); % Function def. below.
S.pb = uicontrol('style','push',...
'units','pix',...
'position',[10 10 180 40],...
'fontsize',14,...
'string','Start Countdown!',...
'callback',{@pb_call,S});
set(S.tmr,'TimerFcn',{@update_disp,S},'StartDelay',1);
function [] = pb_call(varargin)
% Callback and delete from list box
S = varargin{3}
% word string checking
set(S.tmr,'TasksToExecute',str2double(get(S.tx,'string')))
start(S.tmr);
function [] = update_disp(varargin)
S = varargin{3};
N = str2double(get(S.tx,'string'));
set(S.tx,'string',num2str(N-1));
function deleter(obj,edata) %#ok M-Lint doesn't know the callback fmt.
% Callback stopfcn.
wait(obj);
delete(obj);

回答 (1 件)

Geoff Hayes
Geoff Hayes 2022 年 12 月 21 日
@Dongze - is there a reason why you want to stop the timer via a double-click of a button that says "Start Countdown"? Perhaps you can use a different button to pause/stop the timer. If though you really want to do this with a double-click, you could try the following
function [] = pb_call(varargin)
% not keen on using a persistent/static but...
persistent firstButtonPressTime
S = varargin{3};
if (strcmpi(S.tmr.Running,'on'))
% if timer is running, then save the current time or compare against
% the last saved time
if isempty(firstButtonPressTime)
firstButtonPressTime = now;
else
currentTime = now;
% determine the delta in seconds
xDeltaInSeconds = (currentTime - firstButtonPressTime) * 24 * 60 * 60;
% stop timer if two consecutive button presses are less than 0.5
% seconds apart
if xDeltaInSeconds < 0.5
firstButtonPressTime = [];
stop(S.tmr);
else
firstButtonPressTime = currentTime;
end
end
else
set(S.tmr,'TasksToExecute',str2double(get(S.tx,'string')))
start(S.tmr);
end

カテゴリ

Help Center および File ExchangeStartup and Shutdown についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by