Сброс объекта таймера Matlab на время 0
Я использую объект таймера Matlab для поворота некоторых файлов журнала с фиксированным интервалом (каждые 1800 секунд):
rotateTimer = timer( ...
'Name', 'Log Rotator', ...
'Period', 1800, ...
'StartDelay', 1800, ...
'ExecutionMode', 'fixedSpacing', ...
'TimerFcn', {@RotateLogs});
start(rotateTimer);
Этот метод очень хорошо работает для автоматических вращений, но мне нужно разрешить пользователю вручную вращать файлы журнала.
Когда происходит ручное вращение, я хочу, чтобы следующее автоматическое вращение произошло через 1800 секунд; это требует, чтобы я "сбросил" объект таймера, чтобы начать отсчет от 0 в момент ручного вращения.
Я не вижу свойства или метода I может вызвать, что обнулит таймер. Запуск и остановка таймера не сбрасывает его, он просто продолжает отсчет с того места, где он был. Как я могу это сделать?
3 ответов:
Альтернативный способ, который не требует воссоздания объекта timer:
per = 2; t = timer('Period' , per, ... 'StartDelay' , per, ... 'ExecutionMode', 'fixedSpacing',... 'TimerFcn' , 'disp(toc);tic;',... 'StopFcn' , {@mystop,per},... 'StartFcn' , 'tic;'); % Suppress warning from millisecond precision of StartDelay warning('off','MATLAB:TIMER:STARTDELAYPRECISION') start(t) stop(t) delete(t)Где
mystop()- этоfunction mystop(obj,event,in) t = toc; set(obj,'StartDelay',in-t); disp(t) % Not necessary, just to check tic % Not necessary, just to check endИдея здесь заключается в том, что вы можете сбросить
StartDelayпосле каждой остановки, и для этого вам нужно время, прошедшее между каждым выполнением таймера. Это означает, что вы должны сбрасывать данные при каждом выполнении.Примечания :
- сброс в
StartFcn()предназначен для предотвращения негативногоStartDelayот ранее вызванногоtic(если применимо).- в
disp(toc)вTimerFcnнет необходимости и просто проверить, что тайминги в порядке.- той же цели проверки служат две комментируемые строки в
mystop().
Может быть, я просто не понимаю, что вы говорите, но не можете ли вы просто использовать команду " set " для 0 таймера?
Через Окно Командной Строки:
help timer ... Getting and setting parameters: get - Get value of timer object property. set - Set value of timer object property.Поэтому, когда происходит вращение вручную, просто установите таймер обратно на 0
Я не мог прийти к решению этой проблемы путем "сброса" объекта timer, как я намеревался.
Решение, которое действительно работает:
- у меня есть повторяющийся объект timer, который срабатывает с фиксированным интервалом (0,5 С)после включения регистрации.
- при первом включении протоколирования я вызываю
tic()и сохраняю его результат.- в функции обратного вызова таймера я вызываю
toc(), чтобы проверить время, прошедшее с начала регистрации. Если истекшее время превышает порог поворота, я выполняю поворот журнала. Вращение журнала вызываетtic(), чтобы "сбросить" время с момента вращения до 0.- Когда пользователь вручную поворачивает журналы, я вызываю
tic(), чтобы "сбросить" время с момента поворота на 0 и выполнить поворот журнала.Это работает достаточно хорошо для моих целей. Временной джиттер между вращениями журнала составляет около 1 секунды, но это приемлемо для меня. Я мог бы уменьшить период моего объекта таймера, чтобы уменьшить дрожание, если это необходимо.
Comments