MATLAB的定時器功能(timer函數):
1 從MATLAB6.5版本開始,MATLAB開始支持定時器。相對於傳統的pause函數來說,定時器要強大的多,不僅可以等效實現pause的功能,還可以顯示更多pause無法實現的功能,一些需要在一定周期內獨立運行的程序特別適合利用定時器來完成。
2 一個完整的定時器程序並讓它發揮作用,一直到最后刪除需要以下幾個步驟:
第一,利用timer函數建立定時器
第二,利用start函數啟動定時器
第三,利用stop函數停止定時器
第四,利用delete函數刪除定時器
第五,利用clear函數刪除代表定時器句柄的變量。
3 定時器具體是個什么東西?
我們知道,程序運行是自上而下,從左向右的運行方式,除了像while或者for循環控制流之外,程序運行到最末行整個程序就會停止運行。從本質上來說while或for循環控制流也是自上而下,從左向右的運行方式,條件為假停止運行退出。但是我們平時操作一些程序的時候,舉個例子:比如我們玩兒一款游戲叫“王者榮耀”,如果我們能看到他的代碼,其運行方式也是自上而下,從左向右的運行方式,但是全部運行完畢了,這個游戲還是正常在運行並沒有停止。這也就是說,這個游戲運行程序的時候,整個程序到了結尾處再從頭開始運行,如此循環往復,指導我們給定一個條件會停止整個循環往復,這也就實現了程序的整個動態運行。其在MATLAB當中要實現整個功能我們稱之為定時器。
4 第一,利用timer函數建立定時器
timer函數的調用結構非常的簡單,只是一個簡單的句柄函數加屬性的方式,但是其屬性稍微多一些。
t = timer(name,value);
在有的材料上也可以寫成,都是一會兒事兒。
t = time('PropertyName1',PropertyValue1,...,'PropertyNameN',PropertyValueN);
其中t為定時器的句柄變量
name或者PropertyName為屬性名
value或者PropertyValue為屬性值
這樣一個定時器就建立好了。剩下的工作就是用t這個句柄來進行開關刪的操作。
4.1 舉例:
TimerA=timer('timerfcn',@TimerFunA,'StartDelay',0.5,'executionmode','fixedrate');
有這么一個定時器。
TimerA為這個定時器的句柄變量
timer中的屬性和值分別解釋如下:
1) 'timerfcn' ===>>> @TimerFunA
屬性:定時器回調函數 值:@TimerFunA
2)'StartDelay' ===>>> 0.5
屬性:定時器從開始運行到第一次執行TimerFcn直接的時間延遲,單位是秒 值:0.5
3)'executionmode' ===>>> 'fixedrate'
屬性:定時器執行模式 值:在MATLAB中添加計時器回調函數后立即啟動
4.2 其中我們看到其定時器的建立非常簡單,但是其中的屬性值略多,現在就把常用的屬性和可選值進行列舉一下:
屬性名: 屬性描述 : 可選值: 備注:
1.TimerFcn 定時器回調函數 字符串,函數句柄 設置循環函數,timer會循環調用該公式
或者cell數組 通常用@句柄的形式調用一個寫好的函數
上面的例子就是這樣
2.StartDelay 指定定時器從開始運行到第一次 任何大於等於0的double型數值
執行TimerFcn之間的時間延遲, 默認是0秒
單位是秒 當屬性'Running'設為'on'時只讀
3.ExecutionMode 定時器的執行模式 singleshort 這三種模式圖示見MATLAB的doc
fixedDelay singleShot
fixedRate fixedDelay
fixedspacing fixedRate
fixedspacing
4.Period 設置循環時間間隔,即隔多長時間 任何大於0.001的double型數值
循環一次。 默認值是1.0
當屬性'Running'設為'on'時只讀
5.TasksToExecute 指定定時器需要執行TimerFcn函數的次數 設置循環次數。設置為inf,表示無線循環,默認為1
6.TasksToExecuted 從定時器開始運行時其,記錄TimerFcn調 任何大於等於0的double型數值
用的次數,TimerFcn每執行一次, 默認值為1
TasksToExecuted自動加1 始終是只讀型
5 第二,利用start函數啟動定時器
第三,利用stop函數停止定時器
start(TimerA);start(TimerB);
stop(TimerA);
很簡單吧。
6. 關於TimerFcn中的@回調函數的編寫
function f_trade_timer3
% 主程序定時器
TimerA=timer('timerfcn',@TimerFunA,'StartDelay',0.5,'executionmode','fixedrate');
start(TimerA);
function TimerFunA(obj,event)
global main market order risk
if (main.timenum>150000 & main.timenum<153000) | (main.timenum>023000 & main.timenum<030000)
path_trade_data=[pwd,'\data\d_future\d_future_trade\'];
eval(['save ',path_trade_data,'d_future_trade3.mat market order ']);
stop(TimerA);
end
end
end
比如這么一段定時器的編寫,控制大於某一個時間段,保存數據到路徑,然后停止計時器。
其中@TimerFunA句柄了這么一個函數,所以定時器編寫的時候后面一般要加上這么一個函數
這個函數的編寫略有不同,如果是單一的TimerFunc函數的話要按照obj對象和event事件的方式進行起函數名。因為這里是用的對象句柄的方式
類似於 @ TimerFunA , (obj,event)
再比如這么一段代碼
t=timer('TimerFcn',{@timercallback,handles},'ExecutionMode', 'fixedRate', 'Period', 0.01);
start(t)
function timercallback(obj, event,handles)
str=datestr(now, 'HH:MM:SS:FFF');
set(handles.edit1, 'String',str);
