Matlab高級教程_第二篇:Matlab相見恨晚的模塊_01_定時器


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM