原文地址:http://www.ilovematlab.cn/thread-258845-1-1.html
今天突然想實現個多線程功能,尼瑪,被折磨透了。最終才找到了Timer對象和 Dynamic關于Timer的教程。感謝dynamic 大神的無私奉獻。但由于原文應用實例寫的比較特殊,因此單獨寫出一部分總結和一個實例做為自己的貢獻吧。
看了上述資料相信大家對Timer對象的各個屬性和其字段有一定了解,更多的信息可在幫助文件中獲得。這里再總結一下,仔細看Timer對象的句柄我們可以發現,Timer其實由兩部分構成:(一)對象本身的一些屬性,如ExecutionMode等(二)回調函數(Call Back Function)對于第一點,Timer對象實質上與結構體一樣,只需要掌握每個屬性及其字段名即可。可見Timer實現相關功能主要集中在回調函數上。那么與普通函數相比,回調函數有哪些不同呢?1.有默認的入參obj和event。這一點一定要注意,在編寫回調參數時一定要在函數名末尾加(obj,event),否則出錯。2.當有其他入參時,函數調用形式發生變化,需寫在同一元胞數組中。這兩點詳見Dynamic帖子第三部分,這里僅僅予以強調。接下來我將試圖以一個例子,用最最直白的語言告訴大家,尼瑪,這玩意到底怎么用。這是一個畫圓的腳本:alpha=0:pi/20:2*pi;%角度[0,2*pi]R=2;%半徑x=R*cos(alpha);y=R*sin(alpha);plot(x,y,'o-') %畫圖axis equal %平衡坐標軸那么如果我想做一個動畫,讓這個圓每隔一段時間畫一點點,應該怎么畫呢?這無疑要用到多線程控制。及我們介紹的Timer 對象。首先將上述腳本改編成回調函數TimeFcn:(本例中取名為CircleTask)function CircleTask(obj,event)event_time = datestr(event.Data.time); %使用event對象的data的time屬性獲得系統當前時間,并轉換成字符串d=event_time(19:20); %由于本身保存的是年月日小時分鐘秒,但我只需要秒的數據,因此單獨取出d=str2double(d); %將字符串轉換成數字alpha=0:pi/20:pi/20*d;%角度[0,2*pi]ud=obj.UserData; %使用obj對象的UserData屬性傳參R=ud;%半徑x=R*cos(alpha);y=R*sin(alpha);plot(x,y,'o-')axis equal以上就是整個回調函數,將其保存并添加路徑。Timer對象的調用腳本為:t=timer('Name','CircleTimer',...'TimerFcn',@CircleTask,...'Period',1,...'ExecutionMode','fixedspacing');%本句解釋成中文就是:%t= timer(計時器名字是啥?,叫CircleTimer,要輸入的TimerFcn回調函數是啥? ,%用CircleTask這個函數,每次隔多久運行?,一秒,%執行時間間隔的模式是什么?,上次執行完畢到這次執行計時);ud=3;t.UserData=ud;start(t);以上代碼全部復制黏貼進command window按回車即可結束時運行: stop(t);在這里我想說明我回調函數前四步為何那么麻煩:由于matlab本身保存的double型時間包含年月日小時分鐘秒這些信息,而我需要的僅僅是“秒”這一信息,因此不得不先將matlab的double型時間轉換成文字,讀取秒后再轉換成數值。如果大家有更好的方法請務必要告訴我新聞熱點
疑難解答