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