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