日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

定時(shí)器:.NET框架類庫(kù)中定時(shí)器類的比較

 文成Y 2007-09-19

定時(shí)器:.NET框架類庫(kù)中定時(shí)器類的比較


原著:Alex Calvo

翻譯:lxhui



原文出處:MSDN Magazine February 2004(Timer...)

原代碼下載: TimersinNET.exe (126KB)

本文章假定你熟悉C#

概要  
  不論在客戶端應(yīng)用程序還是服務(wù)器組件(包括窗口服務(wù))定時(shí)器通常扮演一個(gè)重要的角色。寫(xiě)一個(gè)高效的定時(shí)器驅(qū)動(dòng)型可管理代碼要求對(duì)程序流程有一個(gè)清晰的理解及掌握.NET線程模型的精妙之處。.NET框架類庫(kù)提供了三種不同的定時(shí)器類:System.Windows.Forms.Timer, System.Timers.Timer, 和System.Threading.Timer。每個(gè)類為不同的場(chǎng)合進(jìn)行設(shè)計(jì)和優(yōu)化。本文章將研究這三個(gè)類并讓你理解如何及何時(shí)應(yīng)該使用哪一個(gè)類。


  Microsoft® Windows®里的定時(shí)器對(duì)象當(dāng)行為發(fā)生時(shí)允許你進(jìn)行控制。定時(shí)器一些最常用的地方就是有規(guī)律的定時(shí)啟動(dòng)一個(gè)進(jìn)程,在事件之間設(shè)置間隔,及當(dāng)進(jìn)行 圖形工作時(shí)維護(hù)固定的動(dòng)畫(huà)速度(而不管處理函數(shù)的速度)。在過(guò)去,對(duì)于使用Visual Basic®的開(kāi)發(fā)者來(lái)說(shuō),定時(shí)器甚至用來(lái)模擬多任務(wù)。
  正如你所期望的那樣,對(duì)于你需要應(yīng)對(duì)的不同場(chǎng)合微軟為你裝備了一些工具。在.NET框架類庫(kù)中有三種不同的定時(shí)器類:System.Windows.Forms.Timer,System.Timers.Timer,和System.Threading.Timer。頭兩個(gè)類出現(xiàn)在Visual Studio® .NET的工具箱窗口,這兩個(gè)定時(shí)器控件都允許你直接把它們拖拽到Windows窗體設(shè)計(jì)器或組件類設(shè)計(jì)器上。如果你不小心,這就是麻煩的開(kāi)始。
  Visual Studio .NET工具箱上的Windows窗體頁(yè)和組件頁(yè)(見(jiàn)Figure 1)都有定時(shí)器控件。非常容易的錯(cuò)誤地使用它們當(dāng)中的一個(gè),或者更糟糕的是,根本意識(shí)不到它們的不同。僅當(dāng)目標(biāo)是Windows窗體設(shè)計(jì)器時(shí)才使用Windows窗體頁(yè)上的定時(shí)器控件。這個(gè)控件將在你的窗體上放置一個(gè)Systems.Windows.Forms.Timer類的實(shí)例。像工具箱上的其它控件一樣,你可以讓Visual Studio .NET處理其生成或者你自己手動(dòng)的實(shí)例和初始化這個(gè)類。

  Figure 1  定時(shí)器控件

  在組件頁(yè)上的定時(shí)器控件可以被安全的用在任何類中。這個(gè)控件創(chuàng)建了一個(gè)System.Timers.Timer類的實(shí)例。如果你正在使用Visual Studio .NET工具箱,無(wú)論是Windows窗體設(shè)計(jì)器還是組件類設(shè)計(jì)器你都可以安全的使用這個(gè)類。在Visual Studio .NET中當(dāng)你設(shè)計(jì)一個(gè)派生于System.ComponentModel.Component的類時(shí)使用組件類設(shè)計(jì)器。System.Threading.Timer類不出現(xiàn)在Visual Studio .NET工具箱窗口上。它稍微有點(diǎn)復(fù)雜但提供了一個(gè)更高級(jí)別的控件,稍后你會(huì)在本文章中看到。

  Figure 2  例子程序

  讓我們首先研究System.Windows.Forms.Timer和System.Timers.Timer類。這兩個(gè)類有著非常相似的對(duì)象模型。稍后我將探索更加高級(jí)的System.Threading.Timer類。Figure 2 是我將在整個(gè)文章引用的例子程序的一個(gè)屏幕快照。這個(gè)應(yīng)用程序?qū)?huì)讓你獲得對(duì)這幾個(gè)定時(shí)器類的清晰的理解。你可以從本文章的開(kāi)始鏈接處下載完整的代碼并試驗(yàn)它。

System.Windows.Forms.Timer
  如果你在找一個(gè)節(jié)拍器,你已經(jīng)走錯(cuò)了地方了。這個(gè)定時(shí)器類引發(fā)的定時(shí)器事件是同你的窗口應(yīng)用程序的其余代碼相同步的。這意味著正在執(zhí)行的代碼從來(lái)不會(huì)被這個(gè)定時(shí)器類的實(shí)例所搶占(假設(shè)你不調(diào)用Application.DoEvents)。就像一個(gè)典型窗體程序里的其它代碼一樣,任何駐留在一個(gè)定時(shí)器事件處理函數(shù)(指的是該類型的定時(shí)器類)中的代碼也是使用應(yīng)用程序的UI線程所執(zhí)行。在空閑時(shí)候,該UI線程同樣要對(duì)應(yīng)用程序的窗體消息隊(duì)列中的所有消息進(jìn)行負(fù)責(zé)。這不僅包括由這個(gè)定時(shí)類引發(fā)的消息,也包括窗體API消息。無(wú)論何時(shí)你的程序不忙于做其它事情時(shí)該UI線程就處理這些消息。
  在Visual Studio .NET之前如果你寫(xiě)過(guò)Visual Basic代碼,你可能知道在一個(gè)窗口應(yīng)用程序里當(dāng)正在執(zhí)行一個(gè)事件處理函數(shù)時(shí)讓你的UI線程去響應(yīng)其它窗體消息的唯一方法就是調(diào)用Application.DoEvents方法。就像Visual Basic一樣,從.NET框架中調(diào)用Application.DoEvents能夠產(chǎn)生許多問(wèn)題。Application.DoEvents產(chǎn)生了對(duì)UI消息泵的控制,讓你對(duì)所有未處理的事件進(jìn)行處理。這能夠改變我剛才提到的所期望的執(zhí)行路徑。如果為了處理由該定時(shí)器類產(chǎn)生的定時(shí)器事件而在你的代碼中有一個(gè)Application.DoEvents的調(diào)用,你的程序流程可能會(huì)被打斷。這會(huì)產(chǎn)生不希望的行為并使調(diào)試?yán)щy。
  運(yùn)行例子程序就會(huì)使這個(gè)定時(shí)器類的行為變得清楚。單擊程序的Start按鈕,接著單擊Sleep按鈕,最后單擊Stop按鈕,將會(huì)產(chǎn)生下面的輸出結(jié)果:
System.Windows.Forms.Timer Started @ 4:09:28 PM--> Timer Event 1 @ 4:09:29 PM on Thread:UIThread--> Timer EVENT 2 @ 4:09:30 PM on Thread: UIThread--> Timer Event 3 @ 4:09:31 PM on Thread: UIThreadSleeping for 5000 ms...--> Timer Event 4 @ 4:09:36 PM on Thread: UIThreadSystem.Windows.Forms.Timer Stopped @ 4:09:37 PM
  例子程序設(shè)置System.Windows.Forms.Timer類的間隔屬性為1000毫秒。正如你所看到的,當(dāng)UI線程正在睡眠(5秒)期間如果定時(shí)器事件處理函數(shù)仍然繼續(xù)捕捉定時(shí)器事件的話,當(dāng)睡眠線程再次被喚醒的時(shí)候應(yīng)該有5個(gè)定時(shí)器事件被顯示——在UI線程睡眠時(shí)每秒鐘一個(gè)。然而,當(dāng)UI線程在睡眠時(shí)定時(shí)器卻保持掛起狀態(tài)。
  對(duì)System.Windows.Forms.Timer的編程不能再簡(jiǎn)單了——它有一個(gè)非常簡(jiǎn)單和可直接編程的接口。Start和Stop方法實(shí)際上提供了一個(gè)設(shè)置使能屬性的改變方法(其本身是對(duì)Win32®的SetTimer和KillTimer功能的一個(gè)包裝)。我剛才提到的間隔屬性,名字本身就說(shuō)明了問(wèn)題。即使技術(shù)上你可以設(shè)置間隔屬性低到1毫秒,但你應(yīng)該知道在.NET框架文檔中指出這個(gè)屬性大約精確到55毫秒(假定UI線程對(duì)于處理是可用的)。
  捕捉由System.Windows.Forms.Timer類實(shí)例引發(fā)的事件是通過(guò)感知一個(gè)標(biāo)準(zhǔn)的EventHandler委托的標(biāo)記事件來(lái)處理的,就像下面的代碼片斷所示:
System.Windows.Forms.Timer tmrWindowsFormsTimer = new    System.Windows.Forms.Timer();tmrWindowsFormsTimer.Interval = 1000;tmrWindowsFormsTimer.Tick += new    EventHandler(tmrWindowsFormsTimer_Tick);tmrWindowsFormsTimer.Start();...private void tmrWindowsFormsTimer_Tick(object sender,    System.EventArgs e){    //Do something on the UI thread...}
System.Timers.Timer
  .NET框架文檔指出System.Timers.Timer類是一個(gè)服務(wù)器定時(shí)器,是為多線程環(huán)境進(jìn)行設(shè)計(jì)和優(yōu)化。該定時(shí)器類的實(shí)例能夠被多個(gè)線程安全地訪問(wèn)。不像System.Windows.Forms.Timer,System.Timers.Timer缺省的,將在一個(gè)工作者線程上調(diào)用你的定時(shí)器事件處理函數(shù),該工作者線程是從公共語(yǔ)言運(yùn)行時(shí)(CLR)線程池中獲得。這意味著在你的逝去的時(shí)間處理函數(shù)代碼中必須遵從Win32編程的黃金規(guī)則:除了創(chuàng)建該控件實(shí)例的線程之外,一個(gè)控件的實(shí)例從來(lái)不被任何其它的線程所訪問(wèn)。
  System.Timers.Timer提供了一個(gè)簡(jiǎn)單的方法處理這樣的困境——暴露一個(gè)公共的SynchronizingObject屬性。把該屬性設(shè)置為一個(gè)窗體實(shí)例(或者窗體上的一個(gè)控件)將保證你的事件處理函數(shù)代碼運(yùn)行在SynchronizingObject被實(shí)例化的同一個(gè)線程里。
  如果你使用了Visual Studio .NET工具箱,Visual Studio .NET自動(dòng)的設(shè)置SynchronizingObject屬性為當(dāng)前的窗體實(shí)例。首先它設(shè)定該定時(shí)器的SynchronizingObject屬性使其在功能上同System.Windows.Forms.Timer類一樣。對(duì)于大部分功能,的確是這樣。當(dāng)操作系統(tǒng)通知System.Timers.Timer類所允許的定時(shí)時(shí)間已過(guò)去,定時(shí)器使用SynchronizingObject.Begin.Invoke方法在一個(gè)線程上去執(zhí)行事件委托,該線程是創(chuàng)建SynchronizingObject的線程。事件處理函數(shù)將被阻塞直到UI線程能夠處理它。然而不像System.Windows.Forms.Timer類一樣,該事件最終仍然能夠被引發(fā)。像你在Figure 2中看到的,當(dāng)UI線程不能夠處理時(shí)System.Windows.Forms.Timer不會(huì)引發(fā)事件,可是當(dāng)UI線程可用時(shí)System.Timers.Timer卻會(huì)排隊(duì)等候處理。
  Figure 3是如何使用SynchronizingObject屬性的例子。使用例子程序并通過(guò)選擇System.Timers.Timer的radio按鈕你可以分析這個(gè)類,并按照?qǐng)?zhí)行System.Windows.Forms.Timer類行為的同樣順序運(yùn)行該類,這樣就會(huì)產(chǎn)生Figure 4的輸出結(jié)果。
  正如你所看到的,它不會(huì)跳過(guò)一個(gè)跳動(dòng)——即使UI線程在睡眠。在每一個(gè)事件間隔就有一個(gè)時(shí)間消失事件處理會(huì)被排隊(duì)執(zhí)行。因?yàn)閁I線程在睡眠,所以當(dāng)UI線程一旦被喚醒例子程序就會(huì)列出5個(gè)定時(shí)器事件(4到8)并能夠處理處理函數(shù)。
  正如我早先提到的,System.Timers.Timer類成員非常類似與System.Windows.Forms.Timer。最大的區(qū)別就在與System.Timers.Timer類是對(duì)Win32可等待定時(shí)對(duì)象的一個(gè)包裝,并在工作者線程上產(chǎn)生一個(gè)時(shí)間片消失事件而不是在UI線程上產(chǎn)生一個(gè)時(shí)間標(biāo)記事件。時(shí)間片消失事件必須與一個(gè)同ElapsedEventHandler委托像匹配的事件處理函數(shù)相連接。事件處理函數(shù)接受一個(gè)ElapsedEventArgs類型的參數(shù)。
  除了標(biāo)準(zhǔn)的EventArgs成員,ElapsedEventArgs類暴露了一個(gè)公共的SignalTime屬性,它包含了一個(gè)精確的定時(shí)器時(shí)間片消失的時(shí)間。因?yàn)檫@個(gè)類支持不同線程的訪問(wèn),除了時(shí)間消失事件所在的線程,應(yīng)該相信它的Stop方法能夠被其它線程所調(diào)用。這會(huì)潛在的導(dǎo)致消失事件被引發(fā)即使其Stop方法已經(jīng)被調(diào)用。你可以把SignalTime和Stop方法調(diào)用的時(shí)間進(jìn)行比較來(lái)解決這個(gè)問(wèn)題。
  System.Timers.Timer也提供了AutoReset屬性來(lái)決定當(dāng)時(shí)間片消失事件引發(fā)后是繼續(xù)進(jìn)行還是只這一次。要記住在定時(shí)器開(kāi)始后重設(shè)間隔屬性會(huì)導(dǎo)致當(dāng)前計(jì)數(shù)為0。比如,設(shè)置了一個(gè)5秒的間隔,在間隔被改變?yōu)?0秒時(shí)3秒已經(jīng)過(guò)去了,那么下一個(gè)定時(shí)器事件將會(huì)在上一個(gè)定時(shí)器事件13秒后發(fā)生。

System.Threading.Timer
  第三個(gè)定時(shí)器類來(lái)自System.Threading名字空間。我愿意說(shuō)這是所有定時(shí)器類中最好的一個(gè),但這會(huì)引起誤導(dǎo)。舉一個(gè)例子,我驚訝的發(fā)現(xiàn)對(duì)于駐留在System.Threading名字空間的這個(gè)類天生就不是線程安全的。(很明顯,這不意味著它不能以線程安全的方式使用)。這個(gè)類的可編程接口同其它兩個(gè)類也不一致,它稍微有點(diǎn)麻煩。
  不像我開(kāi)始描述的兩個(gè)定時(shí)器類,System.Threading.Timer有四個(gè)重載構(gòu)造函數(shù),就像下面這樣:
public Timer(TimerCallback callback, object state, long dueTime,	     long period);public Timer(TimerCallback callback, object state, UInt32 dueTime,	     UInt32 period);public Timer(TimerCallback callback, object state, int dueTime,	     int period);public Timer(TimerCallback callback, object state, TimeSpan dueTime,	     TimeSpan period);
第一個(gè)參數(shù)(callback)要求一個(gè)TimerCallback的委托,它指向一個(gè)方法,該方法具有下面的結(jié)構(gòu):
public void TimerCallback(object state);
第二個(gè)參數(shù)(state)可以為空或者是包含程序規(guī)范信息的對(duì)象。在每一個(gè)定時(shí)器事件被調(diào)用時(shí)該state對(duì)象作為一個(gè)參數(shù)傳遞給你的定時(shí)回調(diào)函數(shù)。記住定時(shí)回調(diào)功能是在一個(gè)工作者線程上執(zhí)行的,所以你必須確保訪問(wèn)state對(duì)象的線程安全。
第三個(gè)參數(shù)(dueTime)讓你定義一個(gè)引發(fā)初始定時(shí)器事件的時(shí)間。你可指定一個(gè)0立即開(kāi)始定時(shí)器或者阻止定時(shí)器自動(dòng)的開(kāi)始,你可以使用System.Threading.Timeout.Infinite常量。
第四個(gè)參數(shù)(period)讓你定義一個(gè)回調(diào)函數(shù)被調(diào)用的時(shí)間間隔(毫秒)。給該參數(shù)定義一個(gè)0或者Timeout.Infinite可以阻止后續(xù)的定時(shí)器事件調(diào)用。
  一旦構(gòu)造函數(shù)被調(diào)用,你仍然可以通過(guò)Change方法改變dueTime和period。該方法有下面四種重載形式:
public bool Change(int dueTime, int period);public bool Change(uint dueTime, uint period);public bool Change(long dueTime, long period);public bool Change(TimeSpan dueTime, TimeSpan period);
  下面是我在例子程序中用到的開(kāi)始和停止該定時(shí)器的代碼:
//Initialize the timer to not start automatically...System.Threading.Timer tmrThreadingTimer = newSystem.Threading.Timer(new		       TimerCallback(tmrThreadingTimer_TimerCallback),		       null, System.Threading.Timeout.Infinite, 1000);//Manually start the timer...tmrThreadingTimer.Change(0, 1000);//Manually stop the timer...tmrThreadingTimer.Change(Timeout.Infinte, Timeout.Infinite);
  正如你所期望的那樣,通過(guò)選擇System.Threading.Timer類運(yùn)行例子程序會(huì)產(chǎn)生同你看到的System.Timers.Timer類一樣的輸出結(jié)果。因?yàn)門(mén)imerCallback功能也是在工作者線程上被調(diào)用,沒(méi)有一個(gè)跳動(dòng)被跳過(guò)(假設(shè)有工作者線程可用)。Figure 5顯示了例子程序的輸出結(jié)果。
  不像System.Timers.Timer類,沒(méi)有與SynchronizingObject相對(duì)應(yīng)的屬性被提供。任何請(qǐng)求訪問(wèn)UI控件的操作都必須通過(guò)控件的Invoke或BeginInvoke方法被列集

定時(shí)器的線程安全編程
  為了最大限度的代碼重用,三種不同類型的定時(shí)器事件都調(diào)用了同樣的ShowTimerEventFired方法,下面就是三個(gè)定時(shí)器事件的處理函數(shù):
private void tmrWindowsFormsTimer_Tick(object sender,    System.EventArgs e){    ShowTimerEventFired(DateTime.Now, GetThreadName());}private void tmrTimersTimer_Elapsed(object sender,    System.TimersElapsedEventArgs e){    ShowTimerEventFired(DateTime.Now, GetThreadName());}private void tmrThreadingTimer_TimerCallback(object state){    ShowTimerEventFired(DateTime.Now, GetThreadName());}
  正如你所看到的,ShowTimerEventFired方法采用當(dāng)前時(shí)間和當(dāng)前線程名字作為參數(shù)。為了區(qū)別工作者線程和UI線程,在例子程序的主入口點(diǎn)設(shè)置CurrentThread對(duì)象的名字屬性為"UIThread"。GetThreadName幫助函數(shù)返回Thread.CurrentThread.Name值或者當(dāng)Thread.CurrentThread.IsThreadPoolThread屬性為真時(shí)返回"WorkerThread"。
  因?yàn)镾ystem.Timers.Timer和System.Threading.Timer的定時(shí)器事件都是在工作者線程上執(zhí)行的,所以在事件處理函數(shù)中的任何用戶交互代碼都不是馬上進(jìn)行的,而是被列集等候返回到UI線程上進(jìn)行處理。為了這樣做,我創(chuàng)建了一個(gè)ShowTimerEventFiredDelegate委托調(diào)用:
private delegate void    ShowTimerEventFiredDelegate    (DateTime eventTime,     string threadName);
  ShowTimerEventFiredDelegate允許ShowTimerEventFired方法在UI線程上調(diào)用它自己,Figure 6顯示了發(fā)生這一切的代碼。
  通過(guò)查詢InvokeRequired屬性可以非常容易的知道你是否從當(dāng)前線程可以安全的訪問(wèn)Windows窗體控件。在這個(gè)例子中,如果列表框的InvokeRequired屬性為真,窗體的BeginInvoke方法就可以被ShowTimerEventFired方法調(diào)用,然后再被ShowTimerEventFiredDelegate方法調(diào)用。這能夠保證列表框的Add方法在UI線程上執(zhí)行。
  正如你所看到的,當(dāng)你編寫(xiě)異步定時(shí)器事件時(shí)有許多問(wèn)題需要意識(shí)到。在使用System.Timers.Timer和System.Threading.Timer之前我推薦你閱讀Ian Griffith的文章“Windows Forms:Give Your .NET-based Application a Fast and Responsive UI with Multiple Threads”, 該文刊登在MSDN雜志的2003年2月份的期刊上。

處理定時(shí)器事件重入
  當(dāng)和異步定時(shí)器事件打交道時(shí),如由System.Timers.Timer和System.Threading.Timer產(chǎn)生的定時(shí)器事件,有另外一個(gè)細(xì)微之處你需要考慮。問(wèn)題就是必須處理代碼重入。如果你的定時(shí)器事件處理函數(shù)代碼執(zhí)行時(shí)間比你的定時(shí)器引發(fā)定時(shí)器事件的時(shí)間間隔要長(zhǎng),你預(yù)先又沒(méi)有采取必要的措施保護(hù)防止多線程訪問(wèn)你的對(duì)象和變量,你就會(huì)陷入調(diào)試的困境??匆幌孪旅娴拇a片斷:
private int tickCounter = 0;private void tmrTimersTimer_Elapsed(object sender,    System.Timers.ElapsedEventArgs e){    System.Threading.Interlocked.Increment(ref tickCounter);    Thread.Sleep(5000);    MessageBox.Show(tickCounter.ToString());}
  假設(shè)你的定時(shí)器間隔屬性設(shè)置為1000毫秒,你也許會(huì)奇怪當(dāng)?shù)谝粋€(gè)信息框彈出時(shí)顯示的值是5。這是因?yàn)樵谶@5秒期間第一個(gè)定時(shí)器事件正在睡眠,而定時(shí)器卻在不同的工作者線程上繼續(xù)產(chǎn)生時(shí)間消失事件。因此,在第一個(gè)定時(shí)器事件處理完成之前tickCounter變量被增加了5次。注意我使用了Interlocked.Increment方法以線程安全的方式增加tickCounter變量的值。也有其它方法可以這樣做,但是Interlock.Increment是為這種操作而特別設(shè)計(jì)的。
  解決這種問(wèn)題的簡(jiǎn)單方法就是在你的事件處理函數(shù)代碼塊中暫時(shí)禁止定時(shí)器,接著再允許定時(shí)器,就像下面的代碼:
private void tmrTimersTimer_Elapsed(object sender,    System.Timers.ElapsedEventArgs e){    tmrTimers.Enabled = false;    System.Threading.Interlocked.Increment(ref tickCounter);    Thread.Sleep(5000);    MessageBox.Show(tickCounter.ToString());    tmrTimersTimer.Enabled = true;}
  有了這段代碼,消息框就會(huì)每5秒鐘顯示一次,就像你所期望的那樣,tickCounter的值每次只增加1。另外一些可選的原始同步對(duì)象就是Monitor或mutex去確保所有將來(lái)的事件被排隊(duì)直到當(dāng)前的事件處理函數(shù)執(zhí)行完成。

結(jié)論
  為了快速方便的看到.NET框架中這三個(gè)定時(shí)器類的不同之處,見(jiàn)Figure 7對(duì)三個(gè)類的比較。當(dāng)使用定時(shí)器類時(shí)有一點(diǎn)你要考慮的就是是否可以使用Windows調(diào)度器去定期的運(yùn)行標(biāo)準(zhǔn)的可執(zhí)行程序來(lái)更簡(jiǎn)單的解決問(wèn)題。

作者簡(jiǎn)介
  Alex Calvo 是微軟認(rèn)證的.NET解決方案開(kāi)發(fā)者。當(dāng)他不進(jìn)行閱讀,編碼或思考時(shí),他就彈吉他。Alex Calvo 的聯(lián)系地址:acalvo@hotmail.com
譯者結(jié)束語(yǔ)
  在翻譯過(guò)程中一些術(shù)語(yǔ)、單詞或詞組總是找不到合適的漢語(yǔ)解釋, 現(xiàn)已經(jīng)將它們列入 MTT 術(shù)語(yǔ)表,希望大家能給出更好的解釋:
  1. Elapsed——消失,時(shí)間消失。意思就是指所設(shè)置的定時(shí)時(shí)間間隔過(guò)去了。在文中主要有Elapsed Event, Elapsed Event
  2. handler, Elapsed timer等詞。
  3. toolbox——工具箱
  4. windows tab——窗體頁(yè)
  5. component tab——組件頁(yè)
  6. handler——處理器,實(shí)際就是所說(shuō)的函數(shù)或方法 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多