kbmMW 5.09測試報告(1)-Scheduler SmartBinding與kbmMW#1

這個版本除了增長新的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,指示事件是否正在SynchronizedSyncQueued中執行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,表示,在取消或清理線程做業時,若是線程任務正在執行,則等待任務執行完成。當前,前提是線程任務沒有在主線程中執行。

相關文章
相關標籤/搜索