2016-05-16 5 views
0

Скажем, у нас есть функция таймера обратного вызова call_time (obj, event). Я хочу узнать прошедшее время (delt_time) во время выполнения функции таймера после его запуска. Кроме того, я хочу использовать это прошедшее время, чтобы решить, будет ли функция продолжена, выполняться или заканчиваться (например, delt_time> 60s). Я хочу, чтобы функция таймера определяла время работы одновременно. Таким образом, код знает, когда прекращать программу, когда она достигает порога. На самом деле, я задал пару подобных вопросов на основе разных способов, которые я пробовал. Но ответов пока нет.Есть ли способ вычесть/суммировать прошедшее время в функции таймера с помощью Matlab?

Теперь я попытался

 function call_time(obj, event) 
     event_time = event.Data.time; 
     event_time = event.Data.time - event_time; 
     while event_time < 60 
      %execute commands 
     end 
     if event_time > 60 
      %terminate execution 
     end 
    end 

Но это не work.Below как я вызываю функцию таймера.

 TimerHandle = timer; 
    TimerHandle.StartFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '... 
     datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]); 
    TimerHandle.TimerFcn = @call_time; 
    TimerHandle.StopFcn = @TimerCleanup; 
    TimerHandle.period = 10; 
    TimerHandle.ExecutionMode = 'fixedRate'; 
    start(TimerHandle); 

Я также пробовал, как предложил Том. Но не работает.

 function call_time(obj, event) 
     event_time = event.Data.time; 
     delta_time = event.Data.time - event_time; 
     while delta_time < 60 
      %execute commands 
      delta_time = event.Data.time - event_time; 
      fprintf('Elapsed %.2f sec\n', delta_time); 
     end 
     if delta_time > 60 
      %terminate execution 
     end 
    end 
+0

Если 'event_time' не изменяется в вашем цикле while, вы, вероятно, застреваете в бесконечном цикле. – Tom

+0

Обновлено, но не работает – Orangeblue

ответ

0

Предполагая, что вы хотите отслеживать время с момента входа обратного вызова, вы можете использовать tic/toc:

function call_time(obj, event) 
    elapsed_sec = 0; 
    t = tic(); 
    while elapsed_sec < 60 
     % execute commands, e.g. something time-consuming 
     A = randn(10000); 
     elapsed_sec = toc(t); 
     fprintf('Elapsed %.2f sec\n', elapsed_sec); 
    end 
end 

UPDATE на параллелизм - выполнение Matlab является однопоточных, так что ничего подобного не существует из коробки. Вы могли бы порождать java-протекторы и иметь один конец другого, но вы, очевидно, не сможете запустить код Matlab внутри (не легко, по крайней мере).

Для чистого Java-решения вы можете проверить this question. Если вам действительно нужно прекратить действие кода Matlab, вы можете использовать вышеупомянутое решение Java и перезвонить с Java на Matlab через JMI/MatlabControl или MATLAB Engine API for Java (на самом деле я даже не уверен, что поток будет прерван в этом случае). Даже если это сработает, это излишне сложнее, чем просто добавление связки toc проверок между вашими утверждениями.

+0

tic/toc не выполняет его одновременно с выполнением команды «% execute, например, занимающей много времени». Есть ли альтернатива? – Orangeblue

+0

Вы не упомянули, что хотите, чтобы это было одновременно - пожалуйста, обновите свой вопрос. Matlab однопоточный, поэтому ничего подобного не существует из коробки. Вы могли бы порождать java-протекторы и иметь один конец другого, но вы, очевидно, не сможете запустить код Matlab внутри. Для чистого Java-решения вы можете проверить [этот вопрос] (http://stackoverflow.com/questions/2733356/killing-thread-after-some-specified-time-limit-in-java). –

+0

Хорошо, я обновлю его. Вот почему я не использовал tic/toc, вместо этого использовал таймер. – Orangeblue