2016-05-16 6 views
0

Angenommen, wir haben eine Callback-Funktion call_time (obj, event). Ich möchte die verstrichene Zeit (delt_time) während der Ausführung der Timer-Funktion wissen, sobald sie gestartet ist. Außerdem möchte ich diese verstrichene Zeit verwenden, um zu entscheiden, ob die Funktion fortgesetzt ausgeführt oder beendet werden soll (zB delt_time> 60s). Ich möchte, dass die Timer-Funktion die Laufzeit gleichzeitig ermittelt. Auf diese Weise weiß der Code, wann er das Programm beenden soll, sobald es den Schwellenwert erreicht. Tatsächlich habe ich ein paar ähnliche Fragen auf der Grundlage verschiedener Wege gestellt, die ich versucht habe. Aber noch keine Antworten.Gibt es eine Möglichkeit, die abgelaufene Zeit in der Timer-Funktion mit Matlab zu subtrahieren/summieren?

Jetzt habe ich versucht,

 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 

Aber es funktioniert nicht work.Below ist, wie ich die Timer-Funktion aufrufen.

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

Ich habe auch versucht, wie Tom vorgeschlagen. Aber nicht so gut.

 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

Wenn 'event_time' nicht in Ihrer while-Schleife geändert wird, stecken Sie wahrscheinlich in einer unendlichen while-Schleife fest. – Tom

+0

Aktualisiert, aber nicht funktioniert – Orangeblue

Antwort

0

Angenommen, Sie Zeit wollen, da der Rückruf Eingang verfolgen, können Sie tic/toc verwenden:

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 auf Gleichzeitigkeit - Matlab Ausführung ist single-threaded, so nichts Vergleichbares existiert aus der Box. Sie könnten Java-Laufflächen spawnen und einen anderen beenden, aber Sie könnten Matlab-Code offensichtlich nicht innerhalb von (zumindest nicht einfach) ausführen.

Für eine reine Java-Lösung können Sie this question auschecken. Wenn Sie wirklich Matlab-Code beenden müssen, können Sie die oben erwähnte Java-Lösung verwenden und von Java nach Matlab über JMI/MatlabControl oder MATLAB Engine API for Java zurückrufen (ich bin eigentlich nicht sicher, dass der Thread in diesem Fall beendet werden würde). Selbst wenn es funktioniert, ist dies unnötig komplizierter als einfach eine Menge von toc Checks zwischen Ihren Aussagen hinzuzufügen.

+0

Tic/Toc tut es nicht gleichzeitig mit der Ausführung von "% ausführen Befehle, z. B. etwas zeitaufwendig" Teil. Gibt es eine Alternative? – Orangeblue

+0

Sie haben nicht erwähnt, dass Sie gleichzeitig möchten - bitte aktualisieren Sie Ihre Frage. Matlab ist single-threaded, also gibt es nichts Vergleichbares. Sie könnten Java-Laufflächen spawnen und einen anderen beenden, aber Sie könnten natürlich Matlab-Code nicht ausführen. Für eine reine Java-Lösung können Sie [diese Frage] (http://stackoverflow.com/questions/2733356/killing-thread-after-some-specified-time-limit-in-java) auschecken. –

+0

Okay, ich werde es aktualisieren. Das ist auch der Grund, warum ich Tic/Toc nicht benutzt habe, sondern einen Timer. – Orangeblue

Verwandte Themen