亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? uthreadpool.pas

?? delphi 實現線程池的代碼單元
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit uThreadPool;

{   aPool.AddRequest(TMyRequest.Create(RequestParam1, RequestParam2, ...)); }

interface
uses
  Windows,
  Classes;

// 是否記錄日志
// {$DEFINE NOLOGS}

type
  TCriticalSection = class(TObject)
  protected
    FSection: TRTLCriticalSection;
  public
    constructor Create;
    destructor Destroy; override;
    // 進入臨界區
    procedure Enter;
    // 離開臨界區
    procedure Leave;
    // 嘗試進入
    function TryEnter: Boolean;
  end;

type
  // 儲存請求數據的基本類
  TWorkItem = class(TObject)
  public
    // 是否有重復任務
    function IsTheSame(DataObj: TWorkItem): Boolean; virtual;
    // 如果 NOLOGS 被定義,則禁用。
    function TextForLog: string; virtual;
  end;

type
  TThreadsPool = class;

  //線程狀態
  TThreadState = (tcsInitializing, tcsWaiting, tcsGetting, tcsProcessing,
    tcsProcessed, tcsTerminating, tcsCheckingDown);
  // 工作線程僅用于線程池內, 不要直接創建并調用它。
  TProcessorThread = class(TThread)
  private
    // 創建線程時臨時的Event對象, 阻塞線程直到初始化完成
    hInitFinished: THandle;
    // 初始化出錯信息
    sInitError: string;
    // 記錄日志
    procedure WriteLog(const Str: string; Level: Integer = 0);
  protected
    // 線程臨界區同步對像
    csProcessingDataObject: TCriticalSection;
    // 平均處理時間
    FAverageProcessing: Integer;
    // 等待請求的平均時間
    FAverageWaitingTime: Integer;
    // 本線程實例的運行狀態
    FCurState: TThreadState;
    // 本線程實例所附屬的線程池
    FPool: TThreadsPool;
    // 當前處理的數據對像。
    FProcessingDataObject: TWorkItem;
    // 線程停止 Event, TProcessorThread.Terminate 中開綠燈
    hThreadTerminated: THandle;
    uProcessingStart: DWORD;
    // 開始等待的時間, 通過 GetTickCount 取得。
    uWaitingStart: DWORD;
    // 計算平均工作時間
    function AverageProcessingTime: DWORD;
    // 計算平均等待時間
    function AverageWaitingTime: DWORD;
    procedure Execute; override;
    function IamCurrentlyProcess(DataObj: TWorkItem): Boolean;
    // 轉換枚舉類型的線程狀態為字串類型
    function InfoText: string;
    // 線程是否長時間處理同一個請求?(已死掉?)
    function IsDead: Boolean;
    // 線程是否已完成當成任務
    function isFinished: Boolean;
    // 線程是否處于空閑狀態
    function isIdle: Boolean;
    // 平均值校正計算。
    function NewAverage(OldAvg, NewVal: Integer): Integer;
  public
    Tag: Integer;
    constructor Create(APool: TThreadsPool);
    destructor Destroy; override;
    procedure Terminate;
  end;

  // 線程初始化時觸發的事件
  TProcessorThreadInitializing = procedure(Sender: TThreadsPool; aThread:
    TProcessorThread) of object;
  // 線程結束時觸發的事件
  TProcessorThreadFinalizing = procedure(Sender: TThreadsPool; aThread:
    TProcessorThread) of object;
  // 線程處理請求時觸發的事件
  TProcessRequest = procedure(Sender: TThreadsPool; WorkItem: TWorkItem;
    aThread: TProcessorThread) of object;
  TEmptyKind = (
    ekQueueEmpty, //任務被取空后
    ekProcessingFinished // 最后一個任務處理完畢后
    );
  // 任務隊列空時觸發的事件
  TQueueEmpty = procedure(Sender: TThreadsPool; EmptyKind: TEmptyKind) of
    object;

  TThreadsPool = class(TComponent)
  private
    csQueueManagment: TCriticalSection;
    csThreadManagment: TCriticalSection;
    FProcessRequest: TProcessRequest;
    FQueue: TList;
    FQueueEmpty: TQueueEmpty;
    // 線程超時閥值
    FThreadDeadTimeout: DWORD;
    FThreadFinalizing: TProcessorThreadFinalizing;
    FThreadInitializing: TProcessorThreadInitializing;
    // 工作中的線程
    FThreads: TList;
    // 執行了 terminat 發送退出指令, 正在結束的線程.
    FThreadsKilling: TList;
    // 最少, 最大線程數
    FThreadsMax: Integer;
    // 最少, 最大線程數
    FThreadsMin: Integer;
    // 池平均等待時間
    function PoolAverageWaitingTime: Integer;
    procedure WriteLog(const Str: string; Level: Integer = 0);
  protected
    FLastGetPoint: Integer;
    // Semaphore, 統計任務隊列
    hSemRequestCount: THandle;
    // Waitable timer. 每30觸發一次的時間量同步
    hTimCheckPoolDown: THandle;
    // 線程池停機(檢查并清除空閑線程和死線程)
    procedure CheckPoolDown;
    // 清除死線程,并補充不足的工作線程
    procedure CheckThreadsForGrow;
    procedure DoProcessed;
    procedure DoProcessRequest(aDataObj: TWorkItem; aThread: TProcessorThread);
      virtual;
    procedure DoQueueEmpty(EmptyKind: TEmptyKind); virtual;
    procedure DoThreadFinalizing(aThread: TProcessorThread); virtual;
    // 執行事件
    procedure DoThreadInitializing(aThread: TProcessorThread); virtual;
    // 釋放 FThreadsKilling 列表中的線程
    procedure FreeFinishedThreads;
    // 申請任務
    procedure GetRequest(out Request: TWorkItem);
    // 清除死線程
    procedure KillDeadThreads;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    // 就進行任務是否重復的檢查, 檢查發現重復就返回 False
    function AddRequest(aDataObject: TWorkItem; CheckForDoubles: Boolean =
      False): Boolean; overload;
    // 轉換枚舉類型的線程狀態為字串類型
    function InfoText: string;
  published
    // 線程處理任務時觸發的事件
    property OnProcessRequest: TProcessRequest read FProcessRequest write
      FProcessRequest;
    // 任務列表為空時解發的事件
    property OnQueueEmpty: TQueueEmpty read FQueueEmpty write FQueueEmpty;
    // 線程結束時觸發的事件
    property OnThreadFinalizing: TProcessorThreadFinalizing read
      FThreadFinalizing write FThreadFinalizing;
    // 線程初始化時觸發的事件
    property OnThreadInitializing: TProcessorThreadInitializing read
      FThreadInitializing write FThreadInitializing;
    // 線程超時值(毫秒), 如果處理超時,將視為死線程
    property ThreadDeadTimeout: DWORD read FThreadDeadTimeout write
      FThreadDeadTimeout default 0;
    // 最大線程數
    property ThreadsMax: Integer read FThreadsMax write FThreadsMax default 1;
    // 最小線程數
    property ThreadsMin: Integer read FThreadsMin write FThreadsMin default 0;
  end;

type
  //日志記志函數
  TLogWriteProc = procedure(
    const Str: string; //日志
    LogID: Integer = 0;
    Level: Integer = 0 //Level = 0 - 跟蹤信息, 10 - 致命錯誤
    );

var
  WriteLog: TLogWriteProc; // 如果存在實例就寫日志

implementation
uses
  SysUtils;

// 儲存請求數據的基本類
{
********************************** TWorkItem ***********************************
}

function TWorkItem.IsTheSame(DataObj: TWorkItem): Boolean;
begin
  Result := False;
end; { TWorkItem.IsTheSame }

function TWorkItem.TextForLog: string;
begin
  Result := 'Request';
end; { TWorkItem.TextForLog }

{
********************************* TThreadsPool *********************************
}

constructor TThreadsPool.Create(AOwner: TComponent);
var
  DueTo: Int64;
begin
{$IFNDEF NOLOGS}
  WriteLog('創建線程池', 5);
{$ENDIF}
  inherited;
  csQueueManagment := TCriticalSection.Create;
  FQueue := TList.Create;
  csThreadManagment := TCriticalSection.Create;
  FThreads := TList.Create;
  FThreadsKilling := TList.Create;
  FThreadsMin := 0;
  FThreadsMax := 1;
  FThreadDeadTimeout := 0;
  FLastGetPoint := 0;
  //
  hSemRequestCount := CreateSemaphore(nil, 0, $7FFFFFFF, nil);

  DueTo := -1;
  //可等待的定時器(只用于Window NT4或更高)
  hTimCheckPoolDown := CreateWaitableTimer(nil, False, nil);

  if hTimCheckPoolDown = 0 then // Win9x不支持
    // In Win9x number of thread will be never decrised
    hTimCheckPoolDown := CreateEvent(nil, False, False, nil)
  else
    SetWaitableTimer(hTimCheckPoolDown, DueTo, 30000, nil, nil, False);
end; { TThreadsPool.Create }

destructor TThreadsPool.Destroy;
var
  n, i: Integer;
  Handles: array of THandle;
begin
{$IFNDEF NOLOGS}
  WriteLog('線程池銷毀', 5);
{$ENDIF}
  csThreadManagment.Enter;

  SetLength(Handles, FThreads.Count);
  n := 0;
  for i := 0 to FThreads.Count - 1 do
    if FThreads[i] <> nil then
    begin
      Handles[n] := TProcessorThread(FThreads[i]).Handle;
      TProcessorThread(FThreads[i]).Terminate;
      Inc(n);
    end;

  csThreadManagment.Leave;  // lixiaoyu 添加于 2009.1.6,如沒有此行代碼無法成功釋放正在執行中的工作者線程,死鎖。

  WaitForMultipleObjects(n, @Handles[0], True, 30000);  // 等待工作者線程執行終止  lixiaoyu 注釋于 2009.1.6

  csThreadManagment.Enter;  // lixiaoyu 添加于 2009.1.6 再次進入鎖定,并釋放資源
  for i := 0 to FThreads.Count - 1 do
    TProcessorThread(FThreads[i]).Free;
  FThreads.Free;
  FThreadsKilling.Free;
  csThreadManagment.Free;

  csQueueManagment.Enter;
  for i := FQueue.Count - 1 downto 0 do
    TObject(FQueue[i]).Free;
  FQueue.Free;
  csQueueManagment.Free;

  CloseHandle(hSemRequestCount);
  CloseHandle(hTimCheckPoolDown);
  inherited;
end; { TThreadsPool.Destroy }

function TThreadsPool.AddRequest(aDataObject: TWorkItem; CheckForDoubles:
  Boolean = False): Boolean;
var
  i: Integer;
begin
{$IFNDEF NOLOGS}
  WriteLog('AddRequest(' + aDataObject.TextForLog + ')', 2);
{$ENDIF}
  Result := False;
  csQueueManagment.Enter;
  try
    // 如果 CheckForDoubles = TRUE
    // 則進行任務是否重復的檢查
    if CheckForDoubles then
      for i := 0 to FQueue.Count - 1 do
        if (FQueue[i] <> nil)
          and aDataObject.IsTheSame(TWorkItem(FQueue[i])) then
          Exit; // 發現有相同的任務

    csThreadManagment.Enter;
    try
      // 清除死線程,并補充不足的工作線程
      CheckThreadsForGrow;

      // 如果 CheckForDoubles = TRUE
      // 則檢查是否有相同的任務正在處理中
      if CheckForDoubles then
        for i := 0 to FThreads.Count - 1 do
          if TProcessorThread(FThreads[i]).IamCurrentlyProcess(aDataObject) then
            Exit; // 發現有相同的任務

    finally
      csThreadManagment.Leave;
    end;

    //將任務加入隊列
    FQueue.Add(aDataObject);

    //釋放一個同步信號量
    ReleaseSemaphore(hSemRequestCount, 1, nil);
{$IFNDEF NOLOGS}
    WriteLog('釋放一個同步信號量)', 1);
{$ENDIF}
    Result := True;
  finally
    csQueueManagment.Leave;
  end;
{$IFNDEF NOLOGS}
  //調試信息
  WriteLog('增加一個任務(' + aDataObject.TextForLog + ')', 1);
{$ENDIF}
end; { TThreadsPool.AddRequest }

{
函 數 名:TThreadsPool.CheckPoolDown
功能描述:線程池停機(檢查并清除空閑線程和死線程)
輸入參數:無
返 回 值: 無
創建日期:2006.10.22 11:31
修改日期:2006.
作    者:Kook
附加說明:
}

procedure TThreadsPool.CheckPoolDown;
var
  i: Integer;
begin
{$IFNDEF NOLOGS}
  WriteLog('TThreadsPool.CheckPoolDown', 1);
{$ENDIF}
  csThreadManagment.Enter;
  try
{$IFNDEF NOLOGS}
    WriteLog(InfoText, 2);
{$ENDIF}
    // 清除死線程
    KillDeadThreads;
    // 釋放 FThreadsKilling 列表中的線程
    FreeFinishedThreads;

    // 如果線程空閑,就終止它
    for i := FThreads.Count - 1 downto FThreadsMin do
      if TProcessorThread(FThreads[i]).isIdle then
      begin
        //發出終止命令
        TProcessorThread(FThreads[i]).Terminate;
        //加入待清除隊列
        FThreadsKilling.Add(FThreads[i]);
        //從工作隊列中除名
        FThreads.Delete(i);
        //todo: ??
        Break;
      end;
  finally
    csThreadManagment.Leave;
  end;
end; { TThreadsPool.CheckPoolDown }

{
函 數 名:TThreadsPool.CheckThreadsForGrow
功能描述:清除死線程,并補充不足的工作線程
輸入參數:無
返 回 值: 無
創建日期:2006.10.22 11:31
修改日期:2006.
作    者:Kook
附加說明:
}

procedure TThreadsPool.CheckThreadsForGrow;
var
  AvgWait: Integer;
  i: Integer;
begin
  {
    New thread created if:
    新建線程的條件:
      1. 工作線程數小于最小線程數
      2. 工作線程數小于最大線程數 and 線程池平均等待時間 < 100ms(系統忙)
      3. 任務大于工作線程數的4倍
  }

  csThreadManagment.Enter;
  try
    KillDeadThreads;
    if FThreads.Count < FThreadsMin then
    begin
{$IFNDEF NOLOGS}
      WriteLog('工作線程數小于最小線程數', 4);
{$ENDIF}
      for i := FThreads.Count to FThreadsMin - 1 do
      try
        FThreads.Add(TProcessorThread.Create(Self));
      except
        on e: Exception do

          WriteLog(
            'TProcessorThread.Create raise: ' + e.ClassName + #13#10#9'Message: '
            + e.Message,
            9
            );
      end
    end
    else if FThreads.Count < FThreadsMax then
    begin
{$IFNDEF NOLOGS}
      WriteLog('工作線程數小于最大線程數 and 線程池平均等待時間 < 100ms', 3);
{$ENDIF}
      AvgWait := PoolAverageWaitingTime;
{$IFNDEF NOLOGS}
      WriteLog(Format(
        'FThreads.Count (%d)<FThreadsMax(%d), AvgWait=%d',
        [FThreads.Count, FThreadsMax, AvgWait]),
        4
        );
{$ENDIF}

      if AvgWait < 100 then
      try
        FThreads.Add(TProcessorThread.Create(Self));
      except
        on e: Exception do
          WriteLog(
            'TProcessorThread.Create raise: ' + e.ClassName +
            #13#10#9'Message: ' + e.Message,
            9
            );
      end;
    end;
  finally
    csThreadManagment.Leave;
  end;
end; { TThreadsPool.CheckThreadsForGrow }

procedure TThreadsPool.DoProcessed;
var
  i: Integer;
begin
  if (FLastGetPoint < FQueue.Count) then
    Exit;
  csThreadManagment.Enter;
  try
    for i := 0 to FThreads.Count - 1 do
      if TProcessorThread(FThreads[i]).FCurState in [tcsProcessing] then
        Exit;
  finally
    csThreadManagment.Leave;
  end;
  DoQueueEmpty(ekProcessingFinished);
end; { TThreadsPool.DoProcessed }

procedure TThreadsPool.DoProcessRequest(aDataObj: TWorkItem; aThread:
  TProcessorThread);
begin
  if Assigned(FProcessRequest) then
    FProcessRequest(Self, aDataObj, aThread);
end; { TThreadsPool.DoProcessRequest }

procedure TThreadsPool.DoQueueEmpty(EmptyKind: TEmptyKind);
begin
  if Assigned(FQueueEmpty) then
    FQueueEmpty(Self, EmptyKind);
end; { TThreadsPool.DoQueueEmpty }

procedure TThreadsPool.DoThreadFinalizing(aThread: TProcessorThread);
begin
  if Assigned(FThreadFinalizing) then
    FThreadFinalizing(Self, aThread);
end; { TThreadsPool.DoThreadFinalizing }

procedure TThreadsPool.DoThreadInitializing(aThread: TProcessorThread);
begin

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩中文字幕区一区有砖一区| 1000精品久久久久久久久| 国产一区二区网址| 国产资源精品在线观看| 国产一区二区三区免费| 色狠狠av一区二区三区| 亚洲bt欧美bt精品| 欧美日韩日日夜夜| 欧美日韩一区二区在线视频| 欧美色视频一区| 欧美猛男gaygay网站| 欧美优质美女网站| 欧美日韩午夜在线| 日韩网站在线看片你懂的| 精品盗摄一区二区三区| 久久精品视频免费| 亚洲天堂av一区| 亚洲午夜电影网| 蜜臀久久99精品久久久久久9| 精品一区二区av| 欧美aa在线视频| 欧美日韩日日骚| 精品久久久久99| 中文在线免费一区三区高中清不卡| 国产精品成人免费精品自在线观看| 亚洲私人黄色宅男| 五月婷婷激情综合| 国产精品自在在线| 91久久一区二区| 日韩欧美高清一区| 亚洲人成影院在线观看| 蜜臀国产一区二区三区在线播放| 久久亚洲精品小早川怜子| 国产1区2区3区精品美女| 中文字幕欧美一| 一区二区三区免费看视频| 亚洲狠狠丁香婷婷综合久久久| 懂色av中文字幕一区二区三区| 国产精品三级视频| 亚洲精品老司机| 国产精品拍天天在线| 国产精品狼人久久影院观看方式| 国产日韩av一区| 日韩中文欧美在线| 日韩欧美中文字幕一区| 亚洲一区二区三区在线看| 亚洲欧美视频一区| 国产精品久久毛片av大全日韩| 91丝袜高跟美女视频| 国产美女精品在线| 亚洲影院免费观看| 亚洲视频一区二区在线观看| 欧美成人乱码一区二区三区| 欧美狂野另类xxxxoooo| 国产一区二区三区免费| 亚洲婷婷在线视频| 中文字幕亚洲电影| 国产曰批免费观看久久久| 欧美福利一区二区| 一区二区三区国产精华| 不卡视频在线观看| 久久久99精品免费观看| 久久精品国产99久久6| 欧美久久久久免费| 亚洲黄色性网站| 色综合天天综合狠狠| 欧美激情自拍偷拍| 国产精品一区二区在线看| 亚洲精品一区二区三区蜜桃下载| 日韩高清在线观看| 日韩三级在线免费观看| 亚洲bt欧美bt精品777| 欧美日韩在线观看一区二区| 精品国产一区久久| 亚洲品质自拍视频| av影院午夜一区| 99国产精品一区| 秋霞午夜av一区二区三区| 久久综合九色综合欧美亚洲| 激情深爱一区二区| av高清久久久| 蜜臀av在线播放一区二区三区| 国产一区二区美女| 国产精品亚洲第一| 色网站国产精品| 在线精品视频免费观看| 欧美日韩高清影院| 欧美丰满少妇xxxxx高潮对白 | 91美女在线看| 丁香五精品蜜臀久久久久99网站 | 精品成人佐山爱一区二区| 成人精品国产一区二区4080| 一区二区三区四区乱视频| 激情六月婷婷久久| 欧洲人成人精品| 亚洲综合一区二区三区| 久久久久久久久久看片| 欧美性生交片4| 狠狠狠色丁香婷婷综合久久五月| 日韩一区中文字幕| 亚洲午夜日本在线观看| 韩国三级在线一区| 激情综合一区二区三区| 久久99国产精品免费| 日韩有码一区二区三区| 欧美日韩亚洲综合一区| 亚洲精品日日夜夜| 欧美色偷偷大香| 美女网站色91| 精品国精品自拍自在线| 99re在线精品| 久久精品国产精品亚洲红杏| 精品va天堂亚洲国产| 国产成人综合在线观看| 国产精品私人影院| 欧美一二区视频| 国产精一品亚洲二区在线视频| 久久综合久色欧美综合狠狠| 欧美日韩一区中文字幕| 午夜视频在线观看一区二区三区 | 国产日韩欧美激情| 国产精品污网站| 国产精品一区二区久激情瑜伽| 99亚偷拍自图区亚洲| 成人午夜精品一区二区三区| 在线播放一区二区三区| 亚洲精品视频一区二区| 91视频国产资源| 国内成人自拍视频| 在线一区二区观看| 欧美一区二区三区四区在线观看 | 日本一区二区三区在线不卡| 中文字幕欧美激情一区| 亚洲一区在线电影| 日本亚洲三级在线| 91亚洲资源网| 久久久久久久久久久电影| 26uuu另类欧美| 欧美日韩国产乱码电影| 91黄色免费观看| 不卡电影免费在线播放一区| 韩国av一区二区三区在线观看| 亚洲成av人片一区二区梦乃 | 26uuu亚洲| 91在线视频免费91| 国产一区二区免费看| 日韩成人精品在线观看| 1024精品合集| 久久尤物电影视频在线观看| 亚洲精品欧美专区| 国产欧美日韩亚州综合| 欧美成人精品3d动漫h| 精品免费视频一区二区| 91精品国产全国免费观看| 精品国精品自拍自在线| 久久久精品人体av艺术| 奇米亚洲午夜久久精品| 日韩欧美中文一区| 国产大陆精品国产| 欧美精品一区二区久久婷婷| 日本午夜精品视频在线观看 | 国产成人av福利| 丁香婷婷综合网| 欧美喷潮久久久xxxxx| 日韩精品中文字幕一区二区三区 | 尤物av一区二区| 亚洲福利视频导航| 不卡免费追剧大全电视剧网站| 91精品在线免费| 精品国产青草久久久久福利| 国产精品久久久久婷婷| 国产精品欧美一区喷水| 美脚の诱脚舐め脚责91 | 亚洲午夜久久久久久久久电影网| 亚洲精品videosex极品| 国产亚洲一区二区三区在线观看| 国产欧美日韩三级| 国产亚洲精品资源在线26u| 亚洲电影激情视频网站| 欧美日韩和欧美的一区二区| 国产亚洲短视频| 欧美日韩一区不卡| 国产在线精品一区二区不卡了| 中文字幕一区不卡| 欧美精品一区二区三区视频| 欧美少妇一区二区| 91色在线porny| 国产精品99久久久| 久久丁香综合五月国产三级网站| 亚洲欧美区自拍先锋| 久久午夜电影网| 色久优优欧美色久优优| 亚洲一区二区三区四区在线观看 | 欧美精品在线一区二区三区| 亚洲男人天堂一区| 成人高清免费观看| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品三级在线观看| 91黄色免费看| 日韩福利电影在线|