線程話題太大,又都是些坑,不知從哪方面講起,所以,想一出是一出了。
不管怎樣,我們從開始使用D,不管有沒有用線程,其實它已經幫我們做了一個最完整的線程執行處理:Application.Run.
這行App.Run,在dpr,想來各位都經常能夠看到,如果跟蹤下去,我們就會發現,它其實就是一個最完整的線程執行體的結構了:
我將裡面一些代碼刪除掉了,再將HandleMessage的代碼復制過來,然後,代碼如下:
procedure TApplication.Run; var Msg: TMsg; begin repeat try if not ProcessMessage(Msg) then Idle(Msg); except HandleException(Self); end; until Terminated; end;
好了,我們不用去看裡面代碼意思,因為從代碼意思來講,它思路很簡單,而且此文,也不是要去分析介紹App的代碼。
這個Run,其實給我們介紹了一個線程執行體的大體結構思路,我覺得有意思的就是這循環體結構了。
上述的APP循環執行體,大體思路是:
1: 調用消息處理();
2: 沒消息,就做空閒處理();
3: 不中斷程序就繼續循環。
這循環結構,我覺得與線程操作大體思路是相符的。那麼,它也是可以看成是線程循環執行結構了:
procedure TMyThread.Execute(); begin repeat try if not DoThreadJob() and not DoThreadIdle() then Sleep(10); except on E: Exception do DoHandleException(E); end; until Terminated; end;
當然,未有作業時,Sleep進行阻塞及切換線程時,可以弄個計數,累計idle的次數,到了一定次數後,再進行sleep,計數再復位。
如下示例:
procedure TMyThread.Execute(); const // 根據線程服務性質,進行設定,或進行外部配置 // MAX_IDLE值越大,表示該線程的處理需要越多時間(切換次數越少), // MAX_IDLE值越小,線程切換次數越多。 MAX_IDLE = 32; var idle_count: Integer; begin idle_count := 0; repeat try if not DoThreadJob() then begin if not DoThreadIdle() then Inc(idle_count) else idle_count := 0; end else idle_count := 0; if idle_count >= MAX_IDLE then begin idle_count := 0; Sleep(10); end; except on E: Exception do DoHandleException(E); end; until Terminated; end;
然後,線程在未有作業處理時,去做空閒處理,空閒處理也未有時,再sleep,我覺得這思路,在寫長期運行的邏輯服務處理是很好的適用思路。
且很多處理,是可以放置於ThreadIdle進行外部處理,再擴展,如同Application.Idle,運行頻率是非常高。。。
好像要寫的東西,就這麼些。。。
水平有限,如有雷同,就是盜鏈,:D
2014.11.02 by qsl