這個版本除了增長新的SmartBinding功能,同時提供了大量的功能更新以及bug修正。其中,SmartBinding的介紹,xalion已經第一時間寫了初識kbmmw 中的smartbind功能,同時還寫了XML-RPC和 JSON-RPC的支持文章。kbmMW的福音,向xalion敬禮!關於SmartBinding,在這個版本沒發佈前,就第一時間翻譯了做者的博文:SmartBinding與kbmMW#1,我想這些資料可讓你們輕鬆的使用這個讓人興奮的功能了!html
由於經常使用Scheduler,因此先看看這個版本爲Scheduler作了哪些改變?函數
1.爲IkbmMWScheduledEvent接口添加了方法SyncQueued:IkbmMWScheduledEvent,功能相似於Synchronized,用來把線程任務(做業)在主線程中同步運行,不一樣的是SyncQueued以非阻塞方式將操做放進隊列,以防止某些死鎖產生。post
2.增長方法:學習
IkbmMWScheduledEvent.AfterEnd測試
IkbmMWScheduledEvent.SynchronizedAfterEndurl
這是可選的方法,若是實現了該方法,一但方法被執行過,那麼將永遠不會被再次執行。spa
3.增長IkbmMWScheduledEvent.Executed:boolean屬性,若是事件至少執行過一次,則返回true。線程
4.爲IkbmMWScheduledEvent接口添加了屬性OnAnonymousAfterEndProcedure:TkbmMWOnAnonymousScheduledProcedure和OnSimpleAnonymousAfterEndProcedure:TkbmMWOnSimpleAnonymousScheduledProcedure,具體同AfterEnd的功能同樣。翻譯
5.爲IkbmMWScheduledEvent接口添加了屬性IsSynchronized,指示事件是否正在Synchronized或SyncQueued中執行。code
6.爲TkbmMWScheduler.Unschedule和Clear等方法添加了可選的const AWait:boolean = true參數。
7.修正了kbmMW Scheduler中的多個bug及一些內存泄漏問題。
8.IkbmMWScheduledEvent增加了EndingAfterRuns方法,該方法可用於在x次成功運行後結束和停用事件。
9.IkbmMWScheduledEvent增加了EndingAfterStalls方法,該方法可用於在x次失敗運行後結束和停用事件。
10.IkbmMWScheduledEvent增加了UnscheduleAtEnd方法,該方法控制是否自動取消計劃並釋放正在結束的事件,默認爲false。
以上內容,基本翻譯的這個版本更新說明中關於Scheduler的內容。下面,準備用代碼來試試這些功能的應用狀況,及會帶給咱們什麼益處。
1.對於新增長SyncQueued方法,本質上,就是經過TThread.Queue與TThread.Synchronize來調用線程做業代碼的區別。因此,這裏理解TThread.Queue與TThread.Synchronize的區別就徹底懂了。
procedure TForm6.Button1Click(Sender: TObject); begin Scheduler.Run(procedure var I: Integer; begin for I := 1 to 10000 do begin text1.Text:=i.ToString; end; end) .SyncQueued//.Synchronized .Activate; end;
上面代碼,其中的匿名函數,就是經過TThread.Queue來執行的。若是將.SyncQueued換成.Synchronized,則經過TThread.Synchronize來執行。
做者爲何加了這個SyncQueued支持呢?原來,在這一版本中,做者在實現SmartBind時用到,具體在單元kbmMWSmartBind的TkbmMWBindings.Update方法中,能夠參考學習更進一步的用法。
2.新增長的AfterEnd與SynchronizedAfterEnd:
這兩個方法,究竟是什麼業務意義呢?與AfterRun及SynchronizedAfterRun又有什麼區別呢?通過查看代碼及測試,原來是這樣:
原有的AfterRun及SynchronizedAfterRun是在每一個子線程任務完成後被調用,也就是說,當Scheduler發起10個線程,那麼每一個線程執行完後,都會調用AfterRun及SynchronizedAfterRun,這樣的話AfterRun及SynchronizedAfterRun會被調用10次,與之不一樣,如今的AfterEnd與SynchronizedAfterEnd是Scheduler發起的10個線程都執行完成後被調用,也就是說無論Scheduler執行多少線程,AfterEnd與SynchronizedAfterEnd都只被調用一次。默認狀況下,AfterEnd與SynchronizedAfterEnd是不被調用的,爲了在Scheduler完成全部任務以後調用AfterEnd,須要設置一下:
.UnscheduleAtEnd(true)
這一點很重要的!(不知道做者爲何默認狀況下不調用AfterEnd與SynchronizedAfterEnd)。
3.TkbmMWScheduler.Unschedule和Clear
這兩個方法,其中Unschedule,取消指定的線程任務,Clear是清理掉全部的線程任務。增長了AWait參數,默認值爲True,表示,在取消或清理線程做業時,若是線程任務正在執行,則等待任務執行完成。當前,前提是線程任務沒有在主線程中執行。