Сброс объекта таймера Matlab на время 0



Я использую объект таймера Matlab для поворота некоторых файлов журнала с фиксированным интервалом (каждые 1800 секунд):

rotateTimer = timer( ...
    'Name', 'Log Rotator', ...
    'Period', 1800, ...
    'StartDelay', 1800, ...
    'ExecutionMode', 'fixedSpacing', ...
    'TimerFcn', {@RotateLogs});
start(rotateTimer);

Этот метод очень хорошо работает для автоматических вращений, но мне нужно разрешить пользователю вручную вращать файлы журнала.

Когда происходит ручное вращение, я хочу, чтобы следующее автоматическое вращение произошло через 1800 секунд; это требует, чтобы я "сбросил" объект таймера, чтобы начать отсчет от 0 в момент ручного вращения.

Я не вижу свойства или метода I может вызвать, что обнулит таймер. Запуск и остановка таймера не сбрасывает его, он просто продолжает отсчет с того места, где он был. Как я могу это сделать?

43   3  

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 секунды, но это приемлемо для меня. Я мог бы уменьшить период моего объекта таймера, чтобы уменьшить дрожание, если это необходимо.

    Ничего не найдено.

Добавить ответ:
Отменить.