線程話題太大,又都是些坑,不知從哪方面講起,所以,想一出是一出了。
不管怎樣,我們從開始使用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