2017-01-24 25 views
0

我想在GUI/Matlab中使用计时器进行倒计时代码。 GUI是通过指南创建的。我的想法是有两个编辑框,其中一个框可以用ss:ms格式填充一个时间(例如50.200)。通过按下开始按钮倒计时应显示在第二个编辑框中并执行。 我现在的问题是,我可以在第二个编辑框中显示秒数而不是毫秒数。我试过sprintf - 但我认为定时器的“TasksToExecute”句柄不接受小数点数字?!有没有办法在编辑框中显示秒和毫秒?

有人可以帮忙吗?还是有人有一个想法如何解决?

谢谢。

 function varargout = Countdown_test(varargin) 
%  COUNTDOWN_TEST MATLAB code for Countdown_test.fig 
%  COUNTDOWN_TEST, by itself, creates a new COUNTDOWN_TEST or raises the existing 
%  singleton*. 
% 
%  H = COUNTDOWN_TEST returns the handle to a new COUNTDOWN_TEST or the handle to 
%  the existing singleton*. 
% 
%  COUNTDOWN_TEST('CALLBACK',hObject,eventData,handles,...) calls the local 
%  function named CALLBACK in COUNTDOWN_TEST.M with the given input arguments. 
% 
%  COUNTDOWN_TEST('Property','Value',...) creates a new COUNTDOWN_TEST or raises the 
%  existing singleton*. Starting from the left, property value pairs are 
%  applied to the GUI before Countdown_test_OpeningFcn gets called. An 
%  unrecognized property name or invalid value makes property application 
%  stop. All inputs are passed to Countdown_test_OpeningFcn via varargin. 
% 
%  *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one 
%  instance to run (singleton)". 
% 
% See also: GUIDE, GUIDATA, GUIHANDLES 

% Edit the above text to modify the response to help Countdown_test 

% Last Modified by GUIDE v2.5 23-Jan-2017 14:47:18 

% Begin initialization code - DO NOT EDIT 
gui_Singleton = 1; 
gui_State = struct('gui_Name',  mfilename, ... 
        'gui_Singleton', gui_Singleton, ... 
        'gui_OpeningFcn', @Countdown_test_OpeningFcn, ... 
        'gui_OutputFcn', @Countdown_test_OutputFcn, ... 
        'gui_LayoutFcn', [] , ... 
        'gui_Callback', []); 
if nargin && ischar(varargin{1}) 
    gui_State.gui_Callback = str2func(varargin{1}); 
end 

if nargout 
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 
else 
    gui_mainfcn(gui_State, varargin{:}); 
end 
% End initialization code - DO NOT EDIT 


% --- Executes just before Countdown_test is made visible. 
function Countdown_test_OpeningFcn(hObject, eventdata, handles, varargin) 
% This function has no output args, see OutputFcn. 
% hObject handle to figure 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
% varargin command line arguments to Countdown_test (see VARARGIN) 

% Choose default command line output for Countdown_test 
handles.output = hObject; 

% Update handles structure 
guidata(hObject, handles); 

% UIWAIT makes Countdown_test wait for user response (see UIRESUME) 
% uiwait(handles.Countdown_test); 


countdown_timer = timer; 
set(countdown_timer,'ExecutionMode','fixedrate'); 
set(countdown_timer,'Period',1.0); 
set(countdown_timer,'TimerFcn',{@countdowntimercallback,handles}); 

% Store the timer in the GUI so it persists for the life of the GUI 
setappdata(handles.Countdown_test, 'Countdown_timer', countdown_timer); 


fileName = 'state.mat'; 

if exist(fileName) 

    load(fileName) 
    set(handles.ed_PS_Time,'String',state.PST); 

    delete(fileName); 
end 



% --- Outputs from this function are returned to the command line. 
function varargout = Countdown_test_OutputFcn(hObject, eventdata, handles) 
% varargout cell array for returning output args (see VARARGOUT); 
% hObject handle to figure 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Get default command line output from handles structure 
varargout{1} = handles.output; 



function ed_countdown_Callback(hObject, eventdata, handles) 
% hObject handle to ed_countdown (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hints: get(hObject,'String') returns contents of ed_countdown as text 
%  str2double(get(hObject,'String')) returns contents of ed_countdown as a double 


% --- Executes during object creation, after setting all properties. 
function ed_countdown_CreateFcn(hObject, eventdata, handles) 
% hObject handle to ed_countdown (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles empty - handles not created until after all CreateFcns called 

% Hint: edit controls usually have a white background on Windows. 
%  See ISPC and COMPUTER. 
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 
    set(hObject,'BackgroundColor','white'); 
end 

set(hObject,'String',''); 


% --- Executes on button press in pb_start. 
function pb_start_Callback(hObject, eventdata, handles) 
% hObject handle to pb_start (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

countdown_timer = getappdata(handles.Countdown_test,'Countdown_timer'); 

anzahl=str2num(get(handles.ed_PS_Time,'String')); 
sprintf('%0.3f',anzahl); 
set(countdown_timer,'TasksToExecute',anzahl); 

start(countdown_timer); 

set(handles.ed_countdown, 'Enable','off'); 

durchlaeufe=get(countdown_timer,'TasksToExecute'); 
setappdata(handles.Countdown_test,'Durchlauf',durchlaeufe); 



function countdowntimercallback(obj,~,handles) 

countdown_timer = getappdata(handles.Countdown_test,'Countdown_timer'); 

durchlaeufe_aktuell=get(countdown_timer,'TasksExecuted'); 

durchlaeufe = getappdata(handles.Countdown_test,'Durchlauf'); 


Countdown = durchlaeufe - durchlaeufe_aktuell; 
sprintf('%0.3f',Countdown); 
set(handles.ed_countdown,'String',Countdown); 

% --- Executes on button press in pb_stop. 
function pb_stop_Callback(hObject, eventdata, handles) 
% hObject handle to pb_stop (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% handles.ed_PS_Time = str2num(get(handles.ed_PS_Time, 'String')); 
% guidata(hObject,handles); 
countdown_timer = getappdata(handles.Countdown_test,'Countdown_timer'); 
stop(countdown_timer); 



function ed_PS_Time_Callback(hObject, eventdata, handles) 
% hObject handle to ed_PS_Time (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hints: get(hObject,'String') returns contents of ed_PS_Time as text 
%  str2double(get(hObject,'String')) returns contents of ed_PS_Time as a double 

% --- Executes during object creation, after setting all properties. 
function ed_PS_Time_CreateFcn(hObject, eventdata, handles) 
% hObject handle to ed_PS_Time (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles empty - handles not created until after all CreateFcns called 

% Hint: edit controls usually have a white background on Windows. 
%  See ISPC and COMPUTER. 
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 
    set(hObject,'BackgroundColor','white'); 
end 

set(hObject,'String','0'); 




% --- Executes when user attempts to close Countdown_test. 
function Countdown_test_CloseRequestFcn(hObject, eventdata, handles) 
% hObject handle to Countdown_test (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hint: delete(hObject) closes the figure 
saveState(handles) 
delete(hObject); 

function saveState(handles) 

state.PST = get(handles.ed_PS_Time, 'String'); 

save('state.mat','state') 
} 

回答

0

在倒数计时器的上下文中,TasksToExecute不在其自己的一个特别有用的值。您感兴趣的值是您的timer对象的Period

例如:

function honktimer 
% Set up dummy GUI 
h.mainfig = figure('MenuBar', 'none', 'ToolBar', 'None'); 
h.totaltimelbl = uicontrol('Style', 'text', 'Units', 'Normalized', ... 
    'Position', [0.05, 0.80, 0.40, 0.05], 'String', 'Countdown Time (ss.ss)'); 
h.totaltimeeb = uicontrol('Style', 'edit', 'Units', 'Normalized', ... 
    'Position', [0.05, 0.70, 0.40, 0.10], 'String', '1.0'); 
h.periodlbl = uicontrol('Style', 'text', 'Units', 'Normalized', ... 
    'Position', [0.55, 0.80, 0.40, 0.05], 'String', 'Update Rate (Hz)'); 
h.periodbox = uicontrol('Style', 'edit', 'Units', 'Normalized', ... 
    'Position', [0.55, 0.70, 0.40, 0.10], 'String', '10'); 
h.cdlbl = uicontrol('Style', 'text', 'Units', 'Normalized', ... 
    'Position', [0.30, 0.55, 0.40, 0.05], 'String', 'Time Remaining (ss.SS)'); 
h.cdbox = uicontrol('Style', 'edit', 'Units', 'Normalized', ... 
    'Position', [0.30, 0.45, 0.40, 0.10], 'String', '', 'Enable', 'inactive'); 
h.sb = uicontrol('Style', 'pushbutton', 'Units', 'Normalized', ... 
    'Position', [0.30, 0.30, 0.40, 0.10], 'String', 'Start Timer'); 
h.sb.Callback = @(p,e)starttimer(h); % Set callback here so h is fully populated 
end 

function starttimer(h) 
% Set up the timer 
UpdateRate = str2double(h.periodbox.String); % Update rate, Hz 
countdowntime = datetime(h.totaltimeeb.String, 'InputFormat', 'ss.SS'); % Convert countdown time to datetime object 
nupdates = fix(countdowntime.Second*UpdateRate); % Calculate number of timer iterations 
countdown = timer('BusyMode', 'drop', 'ExecutionMode', 'fixedRate', ... 
    'Period', 1/UpdateRate, 'StartDelay', 0, 'TasksToExecute', nupdates, ... 
    'StartFcn', @(p,e)startcountdown(h), ... % Execute on timer start 
    'TimerFcn', @(p,e)updatecountdown(p, h) , ... % Execute each timer update 
    'StopFcn', @(p,e)endcountdown(h)); % Execute when timer ends 

start(countdown); % Start the timer! 
end 

function startcountdown(h) 
h.cdbox.String = h.totaltimeeb.String; 
end 

function updatecountdown(timerobj, h) 
currtime = datetime(h.cdbox.String, 'InputFormat', 'ss.SS'); 
tickduration = seconds(timerobj.Period); 
newtime = currtime - tickduration; 
h.cdbox.String = sprintf('%.2f', newtime.Second); 
end 

function endcountdown(h) 
h.cdbox.String = 'Honk'; 
end 

这给了我们一个基本的GUI:

Yay

这里我们假设定时器执行每Period秒(最小分辨率为0.001秒),减去Period倒计时框中当前显示的内容和更新字符串的秒数。对于更稳健的方法,我利用了datetimeseconds来确保时间完全按照陈述表示,而不是假定倒数字符串是十进制秒并使用str2double或类似的。

你也可以去存储的总时间为timer对象的UserData,并确定每个TimerFcn基于呼叫的目标时间,Period时间的方法,而TasksExecuted财产。


对编程计时器的常见注意事项适用。我们假设timer对象的TimerFcn被或多或少地按时调用。 timer的文档在ExecutionMode属性的描述中详细描述了执行情况。