2016-05-16 6 views
0

コールバックタイマー関数call_time(obj、event)があるとします。一度起動すると、タイマー機能の実行中の経過時間(delt_time)を知りたい。 さらに、その経過時間を使用して、関数が実行を継続するか、終了するかを決定したい(delt_time> 60sなど)。私はタイマー機能を同時に実行時間を決定します。このようにすることで、コードはしきい値に達するといつプログラムを終了させるかを知ることができます。実際に、私は試したさまざまな方法に基づいて同様の質問をいくつか出しました。しかし、まだ答えはありません。MatlabでTimer関数の経過時間を減算/合計する方法はありますか?

は今、私は

 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); 

私もTomが提案した方法を試しました。しかし、うまくいきません。

あなたが tic/ tocを使用することができ、あなたはコールバックの入り口からの時間を追跡したいと仮定すると、
 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

whileループで 'event_time'が変更されていない場合は、おそらく無限ループ中で止まっているでしょう。 – Tom

+0

更新されましたが動作していません – Orangeblue

答えて

0

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ソリューションを使用して、JMI/MatlabControlまたはMATLAB Engine API for Java経由でJavaからMatlabにコールバックすることができます(実際にはこのスレッドは終了しているとは確信していません)。それがうまくいっても、あなたの明細書の間にたくさんのチェックを追加するだけでは不必要に複雑です。

+0

tic/tocは "%実行コマンド、例えば時間のかかる何か"の実行と並行して実行しません。代わりがありますか? – Orangeblue

+0

あなたはあなたがそれを同時にしたいと言わなかった - あなたの質問を更新してください。 Matlabはシングルスレッドなので、このようなことは何もしていません。あなたはJavaのトレッドを生成し、別のものを終了させることができますが、明らかに内部でMatlabコードを実行することはできません。純粋なJavaソリューションについては、[この質問](http://stackoverflow.com/questions/2733356/killing-thread-after-some-specified-time-limit-in-java)をチェックすることができます。 –

+0

さて、私はそれを更新します。タイマーを使ってtic/tocを使わなかったのもその理由です。 – Orangeblue

関連する問題