程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> delphi.thread.線程循環執行體結構,delphi.thread線程

delphi.thread.線程循環執行體結構,delphi.thread線程

編輯:Delphi

delphi.thread.線程循環執行體結構,delphi.thread線程


線程話題太大,又都是些坑,不知從哪方面講起,所以,想一出是一出了。 

 

  不管怎樣,我們從開始使用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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved