日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi线程池

發(fā)布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi线程池 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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;
????//?進入臨界區(qū)
????procedure?Enter;
????//?離開臨界區(qū)
????procedure?Leave;
????//?嘗試進入
????function?TryEnter:?Boolean;
??end;

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

type
??TThreadsPool?=?class;

??//線程狀態(tài)
??TThreadState?=?(tcsInitializing,?tcsWaiting,?tcsGetting,?tcsProcessing,
????tcsProcessed,?tcsTerminating,?tcsCheckingDown);
??//?工作線程僅用于線程池內(nèi),?不要直接創(chuàng)建并調(diào)用它。
??TProcessorThread?=?class(TThread)
??private
????//?創(chuàng)建線程時臨時的Event對象,?阻塞線程直到初始化完成
????hInitFinished:?THandle;
????//?初始化出錯信息
????sInitError:?string;
????//?記錄日志
????procedure?WriteLog(const?Str:?string;?Level:?Integer?=?0);
??protected
????//?線程臨界區(qū)同步對像
????csProcessingDataObject:?TCriticalSection;
????//?平均處理時間
????FAverageProcessing:?Integer;
????//?等待請求的平均時間
????FAverageWaitingTime:?Integer;
????//?本線程實例的運行狀態(tài)
????FCurState:?TThreadState;
????//?本線程實例所附屬的線程池
????FPool:?TThreadsPool;
????//?當(dāng)前處理的數(shù)據(jù)對像。
????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;
????//?轉(zhuǎn)換枚舉類型的線程狀態(tài)為字串類型
????function?InfoText:?string;
????//?線程是否長時間處理同一個請求?(已死掉?)
????function?IsDead:?Boolean;
????//?線程是否已完成當(dāng)成任務(wù)
????function?isFinished:?Boolean;
????//?線程是否處于空閑狀態(tài)
????function?isIdle:?Boolean;
????//?平均值校正計算。
????function?NewAverage(OldAvg,?NewVal:?Integer):?Integer;
??public
????Tag:?Integer;
????constructor?Create(APool:?TThreadsPool);
????destructor?Destroy;?override;
????procedure?Terminate;
??end;

??//?線程初始化時觸發(fā)的事件
??TProcessorThreadInitializing?=?procedure(Sender:?TThreadsPool;?aThread:
????TProcessorThread)?of?object;
??//?線程結(jié)束時觸發(fā)的事件
??TProcessorThreadFinalizing?=?procedure(Sender:?TThreadsPool;?aThread:
????TProcessorThread)?of?object;
??//?線程處理請求時觸發(fā)的事件
??TProcessRequest?=?procedure(Sender:?TThreadsPool;?WorkItem:?TWorkItem;
????aThread:?TProcessorThread)?of?object;
??TEmptyKind?=?(
????ekQueueEmpty,?//任務(wù)被取空后
????ekProcessingFinished?//?最后一個任務(wù)處理完畢后
????);
??//?任務(wù)隊列空時觸發(fā)的事件
??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;
????//?執(zhí)行了?terminat?發(fā)送退出指令,?正在結(jié)束的線程.
????FThreadsKilling:?TList;
????//?最少,?最大線程數(shù)
????FThreadsMax:?Integer;
????//?最少,?最大線程數(shù)
????FThreadsMin:?Integer;
????//?池平均等待時間
????function?PoolAverageWaitingTime:?Integer;
????procedure?WriteLog(const?Str:?string;?Level:?Integer?=?0);
??protected
????FLastGetPoint:?Integer;
????//?Semaphore,?統(tǒng)計任務(wù)隊列
????hSemRequestCount:?THandle;
????//?Waitable?timer.?每30觸發(fā)一次的時間量同步
????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;
????//?執(zhí)行事件
????procedure?DoThreadInitializing(aThread:?TProcessorThread);?virtual;
????//?釋放?FThreadsKilling?列表中的線程
????procedure?FreeFinishedThreads;
????//?申請任務(wù)
????procedure?GetRequest(out?Request:?TWorkItem);
????//?清除死線程
????procedure?KillDeadThreads;
??public
????constructor?Create(AOwner:?TComponent);?override;
????destructor?Destroy;?override;
????//?就進行任務(wù)是否重復(fù)的檢查,?檢查發(fā)現(xiàn)重復(fù)就返回?False
????function?AddRequest(aDataObject:?TWorkItem;?CheckForDoubles:?Boolean?=
??????False):?Boolean;?overload;
????//?轉(zhuǎn)換枚舉類型的線程狀態(tài)為字串類型
????function?InfoText:?string;
??published
????//?線程處理任務(wù)時觸發(fā)的事件
????property?OnProcessRequest:?TProcessRequest?read?FProcessRequest?write
??????FProcessRequest;
????//?任務(wù)列表為空時解發(fā)的事件
????property?OnQueueEmpty:?TQueueEmpty?read?FQueueEmpty?write?FQueueEmpty;
????//?線程結(jié)束時觸發(fā)的事件
????property?OnThreadFinalizing:?TProcessorThreadFinalizing?read
??????FThreadFinalizing?write?FThreadFinalizing;
????//?線程初始化時觸發(fā)的事件
????property?OnThreadInitializing:?TProcessorThreadInitializing?read
??????FThreadInitializing?write?FThreadInitializing;
????//?線程超時值(毫秒),?如果處理超時,將視為死線程
????property?ThreadDeadTimeout:?DWORD?read?FThreadDeadTimeout?write
??????FThreadDeadTimeout?default?0;
????//?最大線程數(shù)
????property?ThreadsMax:?Integer?read?FThreadsMax?write?FThreadsMax?default?1;
????//?最小線程數(shù)
????property?ThreadsMin:?Integer?read?FThreadsMin?write?FThreadsMin?default?0;
??end;

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

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

implementation
uses
??SysUtils;

//?儲存請求數(shù)據(jù)的基本類
{
**********?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('創(chuàng)建線程池',?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,如沒有此行代碼無法成功釋放正在執(zhí)行中的工作者線程,死鎖。

??WaitForMultipleObjects(n,?@Handles[0],?True,?30000);??//?等待工作者線程執(zhí)行終止??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
????//?則進行任務(wù)是否重復(fù)的檢查
????if?CheckForDoubles?then
??????for?i?:=?0?to?FQueue.Count?-?1?do
????????if?(FQueue[i]?<>?nil)
??????????and?aDataObject.IsTheSame(TWorkItem(FQueue[i]))?then
??????????Exit;?//?發(fā)現(xiàn)有相同的任務(wù)

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

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

????finally
??????csThreadManagment.Leave;
????end;

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

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

{
函?數(shù)?名:TThreadsPool.CheckPoolDown
功能描述:線程池停機(檢查并清除空閑線程和死線程)
輸入?yún)?shù):無
返?回?值:?無
創(chuàng)建日期: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
????????//發(fā)出終止命令
????????TProcessorThread(FThreads[i]).Terminate;
????????//加入待清除隊列
????????FThreadsKilling.Add(FThreads[i]);
????????//從工作隊列中除名
????????FThreads.Delete(i);
????????//todo:???
????????Break;
??????end;
??finally
????csThreadManagment.Leave;
??end;
end;?{?TThreadsPool.CheckPoolDown?}

{
函?數(shù)?名:TThreadsPool.CheckThreadsForGrow
功能描述:清除死線程,并補充不足的工作線程
輸入?yún)?shù):無
返?回?值:?無
創(chuàng)建日期:2006.10.22?11:31
修改日期:2006.
作????者:Kook
附加說明:
}

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

??csThreadManagment.Enter;
??try
????KillDeadThreads;
????if?FThreads.Count?<?FThreadsMin?then
????begin
{$IFNDEF?NOLOGS}
??????WriteLog('工作線程數(shù)小于最小線程數(shù)',?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('工作線程數(shù)小于最大線程數(shù)?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
??if?Assigned(FThreadInitializing)?then
????FThreadInitializing(Self,?aThread);
end;?{?TThreadsPool.DoThreadInitializing?}

{
函?數(shù)?名:TThreadsPool.FreeFinishedThreads
功能描述:釋放?FThreadsKilling?列表中的線程
輸入?yún)?shù):無
返?回?值:?無
創(chuàng)建日期:2006.10.22?11:34
修改日期:2006.
作????者:Kook
附加說明:
}

procedure?TThreadsPool.FreeFinishedThreads;
var
??i:?Integer;
begin
??if?csThreadManagment.TryEnter?then
??try
????for?i?:=?FThreadsKilling.Count?-?1?downto?0?do
??????if?TProcessorThread(FThreadsKilling[i]).isFinished?then
??????begin
????????TProcessorThread(FThreadsKilling[i]).Free;
????????FThreadsKilling.Delete(i);
??????end;
??finally
????csThreadManagment.Leave
??end;
end;?{?TThreadsPool.FreeFinishedThreads?}

{
函?數(shù)?名:TThreadsPool.GetRequest
功能描述:申請任務(wù)
輸入?yún)?shù):out?Request:?TRequestDataObject
返?回?值:?無
創(chuàng)建日期:2006.10.22?11:34
修改日期:2006.
作????者:Kook
附加說明:
}

procedure?TThreadsPool.GetRequest(out?Request:?TWorkItem);
begin
{$IFNDEF?NOLOGS}
??WriteLog('申請任務(wù)',?2);
{$ENDIF}
??csQueueManagment.Enter;
??try
????//跳過空的隊列元素
????while?(FLastGetPoint?<?FQueue.Count)?and?(FQueue[FLastGetPoint]?=?nil)?do
??????Inc(FLastGetPoint);

????Assert(FLastGetPoint?<?FQueue.Count);
????//壓縮隊列,清除空元素
????if?(FQueue.Count?>?127)?and?(FLastGetPoint?>=?(3?*?FQueue.Count)?div?4)?then
????begin
{$IFNDEF?NOLOGS}
??????WriteLog('FQueue.Pack',?1);
{$ENDIF}
??????FQueue.Pack;
??????FLastGetPoint?:=?0;
????end;

????Request?:=?TWorkItem(FQueue[FLastGetPoint]);
????FQueue[FLastGetPoint]?:=?nil;
????inc(FLastGetPoint);
????if?(FLastGetPoint?=?FQueue.Count)?then?//如果隊列中無任務(wù)
????begin

??????DoQueueEmpty(ekQueueEmpty);
??????FQueue.Clear;
??????FLastGetPoint?:=?0;
????end;
??finally
????csQueueManagment.Leave;
??end;
end;?{?TThreadsPool.GetRequest?}

function?TThreadsPool.InfoText:?string;
begin
??Result?:=?'';
??//end;
??//{$ELSE}
??//var
??//??i:?Integer;
??//begin
??//??csQueueManagment.Enter;
??//??csThreadManagment.Enter;
??//??try
??//????if?(FThreads.Count?=?0)?and?(FThreadsKilling.Count?=?1)?and
??//??????TProcessorThread(FThreadsKilling[0]).isFinished?then
??//??????FreeFinishedThreads;
??//
??//????Result?:=?Format(
??//??????'Pool?thread:?Min=%d,?Max=%d,?WorkingThreadsCount=%d,?TerminatedThreadCount=%d,?QueueLength=%d'#13#10,
??//??????[ThreadsMin,?ThreadsMax,?FThreads.Count,?FThreadsKilling.Count,
??//??????FQueue.Count]
??//????????);
??//????if?FThreads.Count?>?0?then
??//??????Result?:=?Result?+?'Working?threads:'#13#10;
??//????for?i?:=?0?to?FThreads.Count?-?1?do
??//??????Result?:=?Result?+?TProcessorThread(FThreads[i]).InfoText?+?#13#10;
??//????if?FThreadsKilling.Count?>?0?then
??//??????Result?:=?Result?+?'Terminated?threads:'#13#10;
??//????for?i?:=?0?to?FThreadsKilling.Count?-?1?do
??//??????Result?:=?Result?+?TProcessorThread(FThreadsKilling[i]).InfoText?+?#13#10;
??//??finally
??//????csThreadManagment.Leave;
??//????csQueueManagment.Leave;
??//??end;
??//end;
??//{$ENDIF}
end;?{?TThreadsPool.InfoText?}

{
函?數(shù)?名:TThreadsPool.KillDeadThreads
功能描述:清除死線程
輸入?yún)?shù):無
返?回?值:?無
創(chuàng)建日期:2006.10.22?11:32
修改日期:2006.
作????者:Kook
附加說明:
}

procedure?TThreadsPool.KillDeadThreads;
var
??i:?Integer;
begin
??//?Check?for?dead?threads
??if?csThreadManagment.TryEnter?then
??try
????for?i?:=?0?to?FThreads.Count?-?1?do
??????if?TProcessorThread(FThreads[i]).IsDead?then
??????begin
????????//?Dead?thread?moverd?to?other?list.
????????//?New?thread?created?to?replace?dead?one
????????TProcessorThread(FThreads[i]).Terminate;
????????FThreadsKilling.Add(FThreads[i]);
????????try
??????????FThreads[i]?:=?TProcessorThread.Create(Self);
????????except
??????????on?e:?Exception?do
??????????begin
??????????FThreads[i]?:=?nil;
{$IFNDEF?NOLOGS}
??????????WriteLog(
??????????'TProcessorThread.Create?raise:?'?+?e.ClassName?+
??????????#13#10#9'Message:?'?+?e.Message,
??????????9
??????????);
{$ENDIF}
??????????end;
????????end;
??????end;
??finally
????csThreadManagment.Leave
??end;
end;?{?TThreadsPool.KillDeadThreads?}

function?TThreadsPool.PoolAverageWaitingTime:?Integer;
var
??i:?Integer;
begin
??Result?:=?0;
??if?FThreads.Count?>?0?then
??begin
????for?i?:=?0?to?FThreads.Count?-?1?do
??????Inc(result,?TProcessorThread(FThreads[i]).AverageWaitingTime);
????Result?:=?Result?div?FThreads.Count
??end
??else
????Result?:=?1;
end;?{?TThreadsPool.PoolAverageWaitingTime?}

procedure?TThreadsPool.WriteLog(const?Str:?string;?Level:?Integer?=?0);
begin
{$IFNDEF?NOLOGS}
??uThreadPool.WriteLog(Str,?0,?Level);
{$ENDIF}
end;?{?TThreadsPool.WriteLog?}

//?工作線程僅用于線程池內(nèi),?不要直接創(chuàng)建并調(diào)用它。
{
**********?TProcessorThread?**********
}

constructor?TProcessorThread.Create(APool:?TThreadsPool);
begin
??WriteLog('創(chuàng)建工作線程',?5);
??inherited?Create(True);
??FPool?:=?aPool;

??FAverageWaitingTime?:=?1000;
??FAverageProcessing?:=?3000;

??sInitError?:=?'';
??{
??各參數(shù)的意義如下:
?? 
???參數(shù)一:填上?nil?即可。
???參數(shù)二:是否采用手動調(diào)整燈號。
???參數(shù)三:燈號的起始狀態(tài),False?表示紅燈。
???參數(shù)四:Event?名稱,?對象名稱相同的話,會指向同一個對象,所以想要有兩個Event對象,便要有兩個不同的名稱(這名稱以字符串來存.為NIL的話系統(tǒng)每次會自己創(chuàng)建一個不同的名字,就是被次創(chuàng)建的都是新的EVENT)。
???傳回值:Event?handle。
??}
??hInitFinished?:=?CreateEvent(nil,?True,?False,?nil);
??hThreadTerminated?:=?CreateEvent(nil,?True,?False,?nil);
??csProcessingDataObject?:=?TCriticalSection.Create;
??try
????WriteLog('TProcessorThread.Create::Resume',?3);
????Resume;
????//阻塞,?等待初始化完成
????WaitForSingleObject(hInitFinished,?INFINITE);
????if?sInitError?<>?''?then
??????raise?Exception.Create(sInitError);
??finally
????CloseHandle(hInitFinished);
??end;
??WriteLog('TProcessorThread.Create::Finished',?3);
end;?{?TProcessorThread.Create?}

destructor?TProcessorThread.Destroy;
begin
??WriteLog('工作線程銷毀',?5);
??CloseHandle(hThreadTerminated);
??csProcessingDataObject.Free;
??inherited;
end;?{?TProcessorThread.Destroy?}

function?TProcessorThread.AverageProcessingTime:?DWORD;
begin
??if?(FCurState?in?[tcsProcessing])?then
????Result?:=?NewAverage(FAverageProcessing,?GetTickCount?-?uProcessingStart)
??else
????Result?:=?FAverageProcessing
end;?{?TProcessorThread.AverageProcessingTime?}

function?TProcessorThread.AverageWaitingTime:?DWORD;
begin
??if?(FCurState?in?[tcsWaiting,?tcsCheckingDown])?then
????Result?:=?NewAverage(FAverageWaitingTime,?GetTickCount?-?uWaitingStart)
??else
????Result?:=?FAverageWaitingTime
end;?{?TProcessorThread.AverageWaitingTime?}

procedure?TProcessorThread.Execute;

type
??THandleID?=?(hidTerminateThread,?hidRequest,?hidCheckPoolDown);
var
??WaitedTime:?Integer;
??Handles:?array[THandleID]?of?THandle;

begin
??WriteLog('工作線程進常運行',?3);
??//當(dāng)前狀態(tài):初始化
??FCurState?:=?tcsInitializing;
??try
????//執(zhí)行外部事件
????FPool.DoThreadInitializing(Self);
??except
????on?e:?Exception?do
??????sInitError?:=?e.Message;
??end;

??//初始化完成,初始化Event綠燈
??SetEvent(hInitFinished);

??WriteLog('TProcessorThread.Execute::Initialized',?3);

??//引用線程池的同步?Event
??Handles[hidTerminateThread]?:=?hThreadTerminated;
??Handles[hidRequest]?:=?FPool.hSemRequestCount;
??Handles[hidCheckPoolDown]?:=?FPool.hTimCheckPoolDown;

??//時間戳,
??//todo:?好像在線程中用?GetTickCount;?會不正常
??uWaitingStart?:=?GetTickCount;
??//任務(wù)置空
??FProcessingDataObject?:=?nil;

??//大巡環(huán)
??while?not?terminated?do
??begin
????//當(dāng)前狀態(tài):等待
????FCurState?:=?tcsWaiting;
????//阻塞線程,使線程休眠
????case?WaitForMultipleObjects(Length(Handles),?@Handles,?False,?INFINITE)?-
??????WAIT_OBJECT_0?of

??????WAIT_OBJECT_0?+?ord(hidTerminateThread):
????????begin
??????????WriteLog('TProcessorThread.Execute::?Terminate?event?signaled?',?5);
??????????//當(dāng)前狀態(tài):正在終止線程
??????????FCurState?:=?tcsTerminating;
??????????//退出大巡環(huán)(結(jié)束線程)
??????????Break;
????????end;

??????WAIT_OBJECT_0?+?ord(hidRequest):
????????begin
??????????WriteLog('TProcessorThread.Execute::?Request?semaphore?signaled?',?3);
??????????//等待的時間
??????????WaitedTime?:=?GetTickCount?-?uWaitingStart;
??????????//重新計算平均等待時間
??????????FAverageWaitingTime?:=?NewAverage(FAverageWaitingTime,?WaitedTime);
??????????//當(dāng)前狀態(tài):申請任務(wù)
??????????FCurState?:=?tcsGetting;
??????????//如果等待時間過短,則檢查工作線程是否足夠
??????????if?WaitedTime?<?5?then
??????????FPool.CheckThreadsForGrow;
??????????//從線程池的任務(wù)隊列中得到任務(wù)
??????????FPool.GetRequest(FProcessingDataObject);
??????????//開始處理的時間戳
??????????uProcessingStart?:=?GetTickCount;
??????????//當(dāng)前狀態(tài):執(zhí)行任務(wù)
??????????FCurState?:=?tcsProcessing;
??????????try
{$IFNDEF?NOLOGS}
??????????WriteLog('Processing:?'?+?FProcessingDataObject.TextForLog,?2);
{$ENDIF}
??????????//執(zhí)行任務(wù)
??????????FPool.DoProcessRequest(FProcessingDataObject,?Self);
??????????except
??????????on?e:?Exception?do
??????????WriteLog(
??????????'OnProcessRequest?for?'?+?FProcessingDataObject.TextForLog?+
??????????#13#10'raise?Exception:?'?+?e.Message,
??????????8
??????????);
??????????end;

??????????//釋放任務(wù)對象
??????????csProcessingDataObject.Enter;
??????????try
??????????FProcessingDataObject.Free;
??????????FProcessingDataObject?:=?nil;
??????????finally
??????????csProcessingDataObject.Leave;
??????????end;
??????????//重新計算
??????????FAverageProcessing?:=?NewAverage(FAverageProcessing,?GetTickCount?-
??????????uProcessingStart);
??????????//當(dāng)前狀態(tài):執(zhí)行任務(wù)完畢
??????????FCurState?:=?tcsProcessed;
??????????//執(zhí)行線程外事件
??????????FPool.DoProcessed;

??????????uWaitingStart?:=?GetTickCount;
????????end;
??????WAIT_OBJECT_0?+?ord(hidCheckPoolDown):
????????begin
??????????//?!!!?Never?called?under?Win9x
??????????WriteLog('TProcessorThread.Execute::?CheckPoolDown?timer?signaled?',
??????????4);
??????????//當(dāng)前狀態(tài):線程池停機(檢查并清除空閑線程和死線程)
??????????FCurState?:=?tcsCheckingDown;
??????????FPool.CheckPoolDown;
????????end;
????end;
??end;
??FCurState?:=?tcsTerminating;

??FPool.DoThreadFinalizing(Self);
end;?{?TProcessorThread.Execute?}

function?TProcessorThread.IamCurrentlyProcess(DataObj:?TWorkItem):?Boolean;
begin
??csProcessingDataObject.Enter;
??try
????Result?:=?(FProcessingDataObject?<>?nil)?and
??????DataObj.IsTheSame(FProcessingDataObject);
??finally
????csProcessingDataObject.Leave;
??end;
end;?{?TProcessorThread.IamCurrentlyProcess?}

function?TProcessorThread.InfoText:?string;

const
??ThreadStateNames:?array[TThreadState]?of?string?=
??(
????'tcsInitializing',
????'tcsWaiting',
????'tcsGetting',
????'tcsProcessing',
????'tcsProcessed',
????'tcsTerminating',
????'tcsCheckingDown'
????);

begin
{$IFNDEF?NOLOGS}
??Result?:=?Format(
????'%5d:?%15s,?AverageWaitingTime=%6d,?AverageProcessingTime=%6d',
????[ThreadID,?ThreadStateNames[FCurState],?AverageWaitingTime,
????AverageProcessingTime]
??????);
??case?FCurState?of
????tcsWaiting:
??????Result?:=?Result?+?',?WaitingTime='?+?IntToStr(GetTickCount?-
????????uWaitingStart);
????tcsProcessing:
??????Result?:=?Result?+?',?ProcessingTime='?+?IntToStr(GetTickCount?-
????????uProcessingStart);
??end;

??csProcessingDataObject.Enter;
??try
????if?FProcessingDataObject?<>?nil?then
??????Result?:=?Result?+?'?'?+?FProcessingDataObject.TextForLog;
??finally
????csProcessingDataObject.Leave;
??end;
{$ENDIF}
end;?{?TProcessorThread.InfoText?}

function?TProcessorThread.IsDead:?Boolean;
begin
??Result?:=
????Terminated?or
????(FPool.ThreadDeadTimeout?>?0)?and?(FCurState?=?tcsProcessing)?and
????(GetTickCount?-?uProcessingStart?>?FPool.ThreadDeadTimeout);
??if?Result?then
????WriteLog('Thread?dead',?5);
end;?{?TProcessorThread.IsDead?}

function?TProcessorThread.isFinished:?Boolean;
begin
??Result?:=?WaitForSingleObject(Handle,?0)?=?WAIT_OBJECT_0;
end;?{?TProcessorThread.isFinished?}

function?TProcessorThread.isIdle:?Boolean;
begin
??//?如果線程狀態(tài)是?tcsWaiting,?tcsCheckingDown
??//?并且?空間時間?>?100ms,
??//?并且?平均等候任務(wù)時間大于平均工作時間的?50%
??//?則視為空閑。
??Result?:=
????(FCurState?in?[tcsWaiting,?tcsCheckingDown])?and
????(AverageWaitingTime?>?100)?and
????(AverageWaitingTime?*?2?>?AverageProcessingTime);
end;?{?TProcessorThread.isIdle?}

function?TProcessorThread.NewAverage(OldAvg,?NewVal:?Integer):?Integer;
begin
??Result?:=?(OldAvg?*?2?+?NewVal)?div?3;
end;?{?TProcessorThread.NewAverage?}

procedure?TProcessorThread.Terminate;
begin
??WriteLog('TProcessorThread.Terminate',?5);
??inherited?Terminate;
??SetEvent(hThreadTerminated);
end;?{?TProcessorThread.Terminate?}

procedure?TProcessorThread.WriteLog(const?Str:?string;?Level:?Integer?=?0);
begin
{$IFNDEF?NOLOGS}
??uThreadPool.WriteLog(Str,?ThreadID,?Level);
{$ENDIF}
end;?{?TProcessorThread.WriteLog?}

{
**********?TCriticalSection?**********
}

constructor?TCriticalSection.Create;
begin
??InitializeCriticalSection(FSection);
end;?{?TCriticalSection.Create?}

destructor?TCriticalSection.Destroy;
begin
??DeleteCriticalSection(FSection);
end;?{?TCriticalSection.Destroy?}

procedure?TCriticalSection.Enter;
begin
??EnterCriticalSection(FSection);
end;?{?TCriticalSection.Enter?}

procedure?TCriticalSection.Leave;
begin
??LeaveCriticalSection(FSection);
end;?{?TCriticalSection.Leave?}

function?TCriticalSection.TryEnter:?Boolean;
begin
??Result?:=?TryEnterCriticalSection(FSection);
end;?{?TCriticalSection.TryEnter?}

procedure?NoLogs(const?Str:?string;?LogID:?Integer?=?0;?Level:?Integer?=?0);
begin
end;

initialization
??WriteLog?:=?NoLogs;
end.

總結(jié)

以上是生活随笔為你收集整理的Delphi线程池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

亚洲精品在线视频网站 | 国产精品精品国产色婷婷 | 欧美人体xx| 国产小视频在线观看 | 国产一级一片免费播放放 | 久久资源在线 | 婷婷精品国产一区二区三区日韩 | 午夜在线看片 | av资源免费在线观看 | av免费看av | 国内精品久久影院 | 激情久久久久久久久久久久久久久久 | 免费黄色看片 | 亚洲精品网址在线观看 | 麻豆视频在线免费 | 91视视频在线直接观看在线看网页在线看 | 国产一区二区免费在线观看 | 成年人在线观看免费视频 | 欧美夫妻生活视频 | 久草视频播放 | www.xxxx欧美| 91丨精品丨蝌蚪丨白丝jk | 字幕网在线观看 | 麻豆视频在线 | 亚洲天天综合 | 99久久超碰中文字幕伊人 | 99爱爱 | 97综合在线 | 日日爽天天 | 三级av黄色| 在线观看国产日韩欧美 | 久久人人爽人人片 | 激情久久影院 | 99精品视频免费在线观看 | 精品久久久久久久久久久久久 | 天天综合网久久综合网 | 免费看一及片 | 精品一二| 久久婷婷开心 | 午夜av影院 | 人人干在线观看 | av中文字幕第一页 | 国精产品999国精产品视频 | 国产一区在线观看免费 | 国产日韩av在线 | 日日躁夜夜躁aaaaxxxx | 麻豆精品传媒视频 | 在线国产视频一区 | 国产男女爽爽爽免费视频 | 字幕网av| 久久国产麻豆 | 色婷婷狠狠 | 草樱av| 狠狠色丁香久久婷婷综合五月 | 日本在线中文在线 | 黄色片免费在线 | 免费h在线观看 | 国产探花视频在线播放 | 亚洲综合少妇 | 欧美成天堂网地址 | av久久在线| 免费黄在线观看 | av在线电影网站 | 亚洲精品小区久久久久久 | 国产一区影院 | 亚洲色图美腿丝袜 | av福利在线 | 99热超碰在线 | 色噜噜狠狠色综合中国 | 免费在线播放黄色 | 国产成人在线精品 | 又黄又爽又无遮挡免费的网站 | 成人久久毛片 | 美女激情影院 | 精品亚洲免费视频 | 中文字幕第一页av | 在线观看国产永久免费视频 | 激情丁香婷婷 | 91最新地址永久入口 | 久久国产精品一二三区 | 久久精品视频在线看 | 亚洲精品乱码久久久久久高潮 | 五月婷婷在线播放 | 国产精品9区| 欧美 日韩 国产 中文字幕 | 国产成人一区二区在线观看 | 天天色婷婷 | 依人成人综合网 | 黄色av电影免费观看 | japanesefreesex中国少妇 | 欧美日韩在线观看一区二区三区 | 久久优 | 日韩av二区 | 国产第页 | 日韩黄色一级电影 | 成人黄色电影在线 | 精品亚洲一区二区 | 中文在线天堂资源 | 日韩丝袜在线观看 | 国产视频2区 | 亚洲精品xxx | 成人av网址大全 | 五月激情久久久 | 久草在线观 | 久草剧场| 久久国产精品99国产精 | www久久99| 黄色大片免费播放 | 毛片一级免费一级 | 成人h视频在线播放 | 欧美国产亚洲精品久久久8v | 亚洲欧美在线观看视频 | 亚洲一区二区三区四区在线视频 | 久产久精国产品 | 日韩激情视频在线 | 992tv人人网tv亚洲精品 | 91视频在线播放视频 | 久久久91精品国产一区二区三区 | 日本黄色大片儿 | 欧美一区日韩一区 | 在线看中文字幕 | 国产精品久免费的黄网站 | 欧美一区二视频在线免费观看 | 天堂va欧美va亚洲va老司机 | 欧美性生活免费 | 99精品欧美一区二区 | 国产午夜精品一区二区三区 | 久久久久区 | 久久久久久久电影 | 精品一区二区三区四区在线 | 国内精品视频在线播放 | 九九精品视频在线观看 | 人人爽久久久噜噜噜电影 | 国产中文字幕视频 | 国产午夜亚洲精品 | 99热这里有 | 在线视频一二区 | 色黄www小说 | 久久精品一区二区三区国产主播 | 日韩乱理 | 国产专区在线看 | 久久久久久久久久毛片 | 国内久久久久久 | 久久国产精品色婷婷 | 亚洲精品无 | 四虎国产精品成人免费4hu | 国产精品久久亚洲 | 91网在线看 | 久久艹艹 | 色在线最新| 欧美日韩免费网站 | 激情久久伊人 | 欧美日韩在线播放 | 国产男女爽爽爽免费视频 | 久久1区| 久久九九影视网 | 亚洲综合色婷婷 | 天天射天天爽 | 天天操天天操天天爽 | 91麻豆精品| 天天综合久久综合 | 91久久国产露脸精品国产闺蜜 | 色噜噜狠狠狠狠色综合久不 | av片中文字幕 | 日韩精品一区不卡 | 美女黄网站视频免费 | 久草国产精品 | 日韩com | 黄色网址在线播放 | 欧美成人中文字幕 | 久艹视频在线免费观看 | 午夜精品久久 | 亚洲区视频在线观看 | 国产九色在线播放九色 | 久久精品视频在线播放 | www色网站| 在线三级av | 99视频国产在线 | 久久伊人精品天天 | 中文字幕免费国产精品 | www.久久久.cum | 日日干激情五月 | 中文国产成人精品久久一 | 欧美一级视频在线观看 | 成人在线免费av | 精品国产乱码一区二区三区在线 | 中文字幕在线影院 | 韩国av免费在线观看 | 欧美日韩一级在线 | 狠狠色综合网站久久久久久久 | 免费人做人爱www的视 | 日韩av不卡在线播放 | 久久久久久久久久网 | 激情网五月天 | 涩涩成人在线 | 片黄色毛片黄色毛片 | 国产对白av | 免费成人av电影 | 久久久久欧美精品 | 激情综合五月网 | 中文字幕亚洲不卡 | 日本aaaa级毛片在线看 | 精品国产乱码久久久久久1区二区 | 久久不卡免费视频 | 日韩精品在线观看视频 | 日韩精品免费一区二区在线观看 | 99夜色| 久久99久久精品 | 夜添久久精品亚洲国产精品 | 99视频偷窥在线精品国自产拍 | 亚洲视频每日更新 | 午夜在线看片 | 久久永久视频 | 免费av网站在线看 | 国产精品电影一区 | 一区二区三区在线视频观看58 | 最近中文字幕在线 | 亚洲爽爽网 | 欧美午夜理伦三级在线观看 | 日产中文字幕 | 亚洲高清在线观看视频 | 中文字幕黄色网址 | 色综合久久久久久久久五月 | 九九免费在线视频 | 美女视频黄的免费的 | 国产专区视频在线观看 | 嫩草伊人久久精品少妇av | 国产片免费在线观看视频 | 日韩激情小视频 | 日韩高清精品免费观看 | 亚洲精品一区二区三区高潮 | 香蕉免费在线 | 91资源在线播放 | 欧美一二三区在线观看 | 日日夜夜中文字幕 | 精品夜夜嗨av一区二区三区 | 国产999免费视频 | 特级黄色一级 | 九九在线视频免费观看 | 手机在线免费av | 日韩女同一区二区三区在线观看 | 日韩av电影中文字幕在线观看 | 96久久| 91精品国产福利在线观看 | 久久免费观看视频 | 久久久久国产精品免费免费搜索 | 日日精品 | 色五婷婷| 日韩久久久久久久 | 热九九精品 | 日韩av影片在线观看 | 国产精品毛片久久久久久久 | 黄色精品国产 | 久久久www成人免费精品张筱雨 | 一区二区三区在线看 | 久久电影中文字幕视频 | 伊人手机在线 | 91手机视频 | 中文字幕之中文字幕 | 伊人永久在线 | 成人免费网站在线观看 | 97av视频| 亚洲高清av | 国产分类视频 | 激情伊人五月天久久综合 | 在线观看激情av | 黄色1级大片 | 999在线观看视频 | 免费在线播放黄色 | 日韩美视频 | 一级性视频 | 免费观看视频的网站 | 99爱国产精品 | 欧美一区二区精美视频 | 狠狠躁夜夜a产精品视频 | 中文国产在线观看 | 99视频在线看 | 在线亚洲精品 | 久久tv| av视屏在线 | 在线亚洲观看 | 91天堂素人约啪 | 日日碰夜夜爽 | 国产成人在线看 | 国内久久精品视频 | 成人全视频免费观看在线看 | 激情导航| 精品视频在线免费观看 | 午夜黄色影院 | 成年人免费在线 | 日韩精品aaa | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 成人激情开心网 | 欧美精品中文 | 九九视频精品免费 | 国产精品免费久久久久影院仙踪林 | 国产成人精品av在线 | 夜夜躁日日躁 | 日本精品视频在线观看 | 黄色软件在线看 | 久久免费99精品久久久久久 | 久久免费视频精品 | 日韩高清一区 | 99精品亚洲 | 亚洲精品国产精品国 | 一区二区三区日韩在线 | 中文字幕在线视频第一页 | 日韩精品免费在线观看 | 手机av电影在线 | 91中文字幕网 | 我要色综合天天 | 欧美午夜久久 | 日日操操 | 国产一区在线视频 | 久久a免费视频 | 成人日韩av | 黄色av一级| 亚洲欧美国产精品18p | 免费看v片 | 久草免费色站 | 色99久久 | avhd高清在线谜片 | 操操操天天操 | 国产成人专区 | 最新免费中文字幕 | 亚洲美女视频在线 | 丰满少妇在线观看资源站 | 中文字幕一区二区三区精华液 | 欧美a级在线播放 | 少妇自拍av| av免费福利 | 中文字幕在线观看的网站 | 在线欧美a | 国产手机在线 | 久久免费在线观看 | 激情丁香在线 | 精品久久久久久国产91 | 99亚洲国产| 深夜免费福利视频 | 天天干天天操天天爱 | 黄色官网在线观看 | 亚洲日本精品 | 亚洲综合在线视频 | 91香蕉嫩草| 日韩一区二区三区不卡 | 国内精品中文字幕 | 日韩午夜电影院 | 亚洲永久精品视频 | 91九色视频在线播放 | 精品国产一区二区三区男人吃奶 | 欧美一二三区播放 | 日韩特级片 | 久免费| 免费看毛片网站 | 国内精品久久久久久久 | 最近中文字幕在线中文高清版 | 午夜影视一区 | 久久96| 一级片黄色片网站 | 五月婷婷综合色拍 | 国内精品久久久久影院一蜜桃 | 日本性生活一级片 | 欧美日韩国产综合网 | 欧美一级免费黄色片 | 国产成人av一区二区三区在线观看 | 精品国产一区二区三区久久 | 丰满少妇高潮在线观看 | 黄色国产成人 | 午夜视频在线网站 | 欧美国产日韩在线观看 | 精品久久网| 欧美久久电影 | 国产亚洲精品久久久久久移动网络 | 毛片永久免费 | 人人艹人人 | 最近日韩中文字幕中文 | 国产精品不卡av | 一区二区激情 | 成人黄色短片 | 久久久久在线观看 | 五月婷婷丁香色 | 国产精品久久电影观看 | 91精品国产91久久久久久三级 | 日韩精品在线观看视频 | 月下香电影| 在线观看免费91 | 我爱av激情网 | 亚洲最新av在线网址 | 国产在线专区 | 嫩草av在线| 激情av一区二区 | 欧美精品一区在线发布 | 欧美韩国日本在线观看 | 草在线 | 欧美色图30p| 欧美性极品xxxx娇小 | 亚洲 精品在线视频 | 国产精品成人一区二区 | 99精品免费视频 | 91精品爽啪蜜夜国产在线播放 | 欧美日韩一区二区三区在线免费观看 | 九九久久久久99精品 | 精品一区二区免费视频 | 在线观看日韩精品 | 天堂网中文在线 | 丁香六月在线观看 | 一区二区三区动漫 | 日韩在线观看视频在线 | 天天看天天干天天操 | 成人四虎 | 韩国三级av在线 | 99热99 | 国产无遮挡又黄又爽馒头漫画 | avav片| 亚洲春色综合另类校园电影 | 国模一二三区 | 在线免费av播放 | 丁香六月在线观看 | 婷婷久久久 | 午夜视频欧美 | 粉嫩一区二区三区粉嫩91 | 青草视频在线播放 | 五月天丁香 | 少妇bbr搡bbb搡bbb| 日韩在线免费高清视频 | 成人网页在线免费观看 | av在线播放中文字幕 | av网站地址| 成人性生交大片免费观看网站 | 色中文字幕在线观看 | 精品极品在线 | 亚洲不卡123| 国产午夜在线观看视频 | 九九激情视频 | 在线观看亚洲电影 | 婷婷四房综合激情五月 | 综合在线色 | 久草视频在线资源 | 天天干夜夜夜操天 | 狠狠色丁香婷婷综合橹88 | 一区二区三区精品久久久 | 国产色一区 | 久久国内精品视频 | 色播激情五月 | 欧美久久久久久久久久久久 | 久在线 | 亚洲夜夜爽 | 日韩成人不卡 | 亚洲乱码久久久 | 欧美一级片在线免费观看 | 亚洲午夜精品久久久久久久久久久久 | 欧美视频www | 亚洲人久久久 | 97精品超碰一区二区三区 | 国产精品久久嫩一区二区免费 | 精品国产一区二区三区久久久 | 天天操天天干天天摸 | 久久免费国产电影 | 狠狠婷婷 | 欧美精品天堂 | 99热手机在线 | av中文资源在线 | 4438全国亚洲精品在线观看视频 | 国产精品视频在线观看 | 亚洲闷骚少妇在线观看网站 | 亚洲无吗视频在线 | 91探花国产综合在线精品 | 婷婷在线免费视频 | 久草在线视频免费资源观看 | 国产又粗又猛又爽又黄的视频免费 | 最近日韩中文字幕中文 | 激情综合五月天 | 久久经典国产 | 亚洲精品综合一二三区在线观看 | 欧美日韩国产精品一区二区 | 美女天天操 | 在线观看的av网站 | 国内精品久久久久久久97牛牛 | 免费成人在线观看 | 亚洲国产中文字幕 | 一区二区中文字幕在线观看 | 久草视频免费 | 亚洲理论在线观看电影 | 色婷婷婷 | 久久看片网 | 欧美日韩在线观看一区 | 国产精品毛片一区二区在线看 | 久久高清国产 | 97超碰在线免费观看 | 91探花在线视频 | 日日操天天操夜夜操 | 久久久精品国产一区二区电影四季 | 日韩专区在线观看 | 成人黄色片在线播放 | 日本在线视频一区二区三区 | 中文国产字幕在线观看 | 国产91免费看 | 热久久免费视频精品 | 99在线精品视频观看 | 国产麻豆传媒 | 国产日产精品久久久久快鸭 | 精品久久久久久久 | 久久视频精品在线观看 | 五月天伊人 | 波多在线视频 | 九九热视频在线 | av久久在线 | 国产高清视频在线播放一区 | 国产日韩欧美在线播放 | 精品国产一区在线观看 | 国产精品久久久久久久久久久久午 | 一级黄色大片 | av福利在线导航 | 五月婷网 | 欧美日比视频 | 91精品国 | 日韩在线首页 | 亚洲欧洲日韩在线观看 | 色在线免费 | 国产小视频你懂的 | 亚洲国产免费看 | 国产视频中文字幕 | 黄色日视频 | 日日操日日 | 国产成人久久精品77777 | 久久伊人爱 | 国产精品黄| 国产高清视频在线播放一区 | 欧美成人一二区 | 日韩在线高清免费视频 | 99久久久| 最新国产在线观看 | 伊人天天综合 | 婷婷播播网 | 色偷偷网站视频 | 成人久久国产 | 国产精品专区一 | 美女黄濒| 久久在线免费 | 91福利社区在线观看 | 国产理论影院 | 国产精品99久久免费黑人 | 欧美日韩精品免费观看 | 欧美日韩在线免费观看 | 国产一区二区在线精品 | 久久久久久蜜av免费网站 | 国产成人精品一区二区在线 | 中文区中文字幕免费看 | 激情五月色播五月 | 人成电影网 | 日本精品在线看 | 国产69久久久欧美一级 | 国产剧情在线一区 | 成人av午夜 | 国产丝袜制服在线 | 99国产精品 | 91成人精品在线 | 欧美日韩中文国产 | 日本精品二区 | 五月激情五月激情 | 日本精a在线观看 | 香蕉久久久久 | 黄色福利视频网站 | 全黄色一级片 | 天天天天天天天操 | 亚洲综合爱 | 日韩欧美视频一区二区 | 日韩在线观看精品 | 999超碰 | 91福利视频免费观看 | 中文字幕二区三区 | 日日夜夜天天久久 | 18做爰免费视频网站 | 2022久久国产露脸精品国产 | 91av视频在线免费观看 | 欧美精品久久久久久 | 国产精品成人av电影 | 国内精品久久久 | 日韩欧美精品在线视频 | 99久久精品无免国产免费 | 精品专区| 久久久精品一区二区三区 | 久久久免费av | 久久激情视频免费观看 | 成人在线播放av | 亚洲精品久久久久久久蜜桃 | 久久久亚洲精华液 | 国产成人精品久久久久蜜臀 | 色综合久久久久久中文网 | 中文字幕在线播放日韩 | 亚洲国产99 | 欧美 高跟鞋交 xxxxhd | 99久久精品久久久久久清纯 | 久久99精品国产麻豆宅宅 | 日韩激情中文字幕 | 国产午夜精品av一区二区 | 极品久久久久久久 | 久久久久久久久久久免费 | 成片免费观看视频 | 高清av在线免费观看 | 九九爱免费视频在线观看 | 九九欧美| 久久综合色天天久久综合图片 | 99久久婷婷国产一区二区三区 | 精品国产一区二区三区四 | 亚洲人精品午夜 | 国产高清免费视频 | 在线成人免费电影 | 天天添夜夜操 | 亚洲国产精品小视频 | 亚洲日本欧美在线 | www看片网站| 久久精品女人毛片国产 | 久久国产综合视频 | 亚洲在线免费视频 | 精品国产福利在线 | 99久久婷婷国产综合亚洲 | 狠狠狠色丁香婷婷综合久久88 | 国产视频一区二区在线播放 | 毛片精品免费在线观看 | 亚洲精品乱码久久久久 | 91亚·色 | 久久免费在线视频 | 国产一级片直播 | 亚洲最大成人免费网站 | 国产69精品久久久久久久久久 | 欧美日韩性视频在线 | 特级a老妇做爰全过程 | 美女在线免费观看视频 | 九九有精品 | 福利片视频区 | 日韩区在线观看 | 久久久久高清毛片一级 | www日日夜夜| 欧美成人在线免费观看 | 免费在线观看av网址 | 欧美日韩色婷婷 | 精品国产理论片 | 色人久久 | av 一区 二区 久久 | 欧美在线日韩在线 | 日日夜夜天天久久 | 精品在线一区二区 | www黄com | 亚洲乱码精品久久久 | 97在线观看免费视频 | 四虎成人免费影院 | 欧美在线你懂的 | 国产亚洲在线观看 | 国产视频在线免费观看 | 日韩在线观 | 夜夜爽www | 狠狠色噜噜狠狠 | 免费在线观看不卡av | 九九激情视频 | 亚洲天天在线日亚洲洲精 | 国产亚洲精品av | 国产麻豆精品一区 | 日韩一区二区三区免费视频 | 婷婷在线网站 | 在线观看成人网 | 9999精品免费视频 | 日本黄色大片免费 | 亚洲永久精品视频 | 17婷婷久久www | 精品久久久免费视频 | 蜜臀av.com| 成人在线黄色电影 | 久久国产精品99久久久久久进口 | 中文字幕在线国产精品 | 国产精品一区二区三区四 | 婷婷六月天天 | 91中文字幕在线观看 | 极品美女被弄高潮视频网站 | 在线免费观看一区二区三区 | 又黄又爽免费视频 | 美女精品 | 久久99精品国产一区二区三区 | 99久久er热在这里只有精品66 | 一本一本久久a久久 | 久久成人18免费网站 | 日本动漫做毛片一区二区 | 国产在线欧美日韩 | 国产亚洲精品久久久久久移动网络 | 99久久99久久精品国产片果冰 | 亚洲国产中文字幕 | 91av片 | 搡bbbb搡bbb视频 | 亚洲成人资源在线 | 91在线最新 | 国产精品久久电影观看 | 天天爱天天 | 日韩精品视频在线观看免费 | 中文字幕在线不卡国产视频 | 激情视频一区二区 | 日韩在线免费播放 | 亚洲精品国产麻豆 | 国产黄色片免费在线观看 | 久久久久久久综合色一本 | 99r在线观看 | 亚洲精选视频免费看 | 欧美淫aaa免费观看 日韩激情免费视频 | 国产一卡久久电影永久 | 国产精品视频地址 | 最新国产福利 | 成人黄大片视频在线观看 | 国产特级毛片aaaaaaa高清 | www四虎影院 | 国产一区不卡在线 | 97免费在线视频 | 69av视频在线 | 欧美性免费 | 成人免费视频网站在线观看 | 天天综合色天天综合 | 久久久久五月 | 国产视频首页 | 欧美精品一区二区蜜臀亚洲 | 欧美做受xxx| 国产精品电影一区二区 | 天天曰天天曰 | 色无五月 | 色婷婷综合久久久久中文字幕1 | 中文字幕欧美日韩va免费视频 | 99久久精品国产一区二区三区 | 国产免费资源 | 五月香视频在线观看 | 欧美极品xxx | 91视频这里只有精品 | 久久精品艹 | 久久女同性恋中文字幕 | 国产精品一区在线播放 | 天天天天干| 高清一区二区 | 91欧美在线| 国产99在线免费 | 国产午夜精品一区二区三区在线观看 | 日日夜夜91 | 国产五月天婷婷 | a亚洲视频| 亚洲 中文字幕av | 国产一二区在线观看 | 91在线免费播放视频 | 中文字幕在线影院 | 欧美色综合天天久久综合精品 | 亚洲一区二区三区四区精品 | 99视频这里只有 | 日韩免费电影一区二区三区 | 天天色天天搞 | 在线免费观看国产视频 | 亚洲成人第一区 | 国产亚洲精品免费 | 国产精品久久人 | 亚洲免费av在线播放 | 精品久久久久久久久中文字幕 | 五月天亚洲婷婷 | 久久免费福利 | 亚洲婷婷综合色高清在线 | 91在线91| 国产又粗又猛又爽又黄的视频先 | 亚洲精品观看 | 中文字幕在线观看网站 | 国产精品久久久久久久久久三级 | 日本精品视频一区二区 | 波多野结衣一区 | 人人添人人澡人人澡人人人爽 | 国产高清精品在线观看 | 久久爱综合 | 日本三级人妇 | 天天爱综合 | 日本天天色 | 蜜臀av性久久久久av蜜臀三区 | 亚洲国产精品久久久 | 久要激情网| 久久精品www人人爽人人 | 97电影院网 | 狠狠操影视 | 久草在线观看视频免费 | 精品在线不卡 | 免费高清在线观看成人 | av一区二区三区在线播放 | 天天操天天干天天插 | 日韩精品中文字幕一区二区 | 成人午夜精品福利免费 | 免费观看完整版无人区 | 黄色av一区 | av成人动漫 | 在线观看亚洲免费视频 | 免费福利在线观看 | 欧美精品资源 | 国产精品美女久久久久久久网站 | 日本三级中文字幕在线观看 | 色噜噜在线观看视频 | 国偷自产视频一区二区久 | 一本—道久久a久久精品蜜桃 | 超碰在线人人草 | 亚洲国产电影在线观看 | 欧美精品免费在线观看 | 亚洲精品视频偷拍 | 欧美精品一区二区三区一线天视频 | 成人高清在线观看 | 国产老太婆免费交性大片 | 区一区二区三在线观看 | 亚洲黄色免费在线 | www.91国产 | 91视频免费 | 激情www| 中文字幕在线播放日韩 | 亚洲精品午夜久久久 | 免费在线观看成人av | 国产九九在线 | 国产黄色大片免费看 | 亚洲国产美女精品久久久久∴ | 久久久精品网站 | 色综合天天爱 | 992tv人人草 黄色国产区 | 中文字幕日韩国产 | 一区二区三区观看 | 国内精品久久久久影院一蜜桃 | 天堂av免费看 | 国产精品嫩草影院99网站 | 婷婷激情在线 | 六月丁香社区 | 欧美日韩亚洲在线观看 | 97成人在线视频 | 精品99在线视频 | 超碰在线天天 | 免费的黄色的网站 | 色资源网免费观看视频 | 国产不卡在线播放 | 麻豆影音先锋 | 成人一级免费电影 | 天天天天综合 | 97涩涩视频 | 精品你懂的| 久久久99精品免费观看 | 免费在线观看av的网站 | 丁香六月在线 | 国产精品视频免费在线观看 | 日本中文字幕在线视频 | 九九日韩 | 久久久99国产精品免费 | 国产激情电影综合在线看 | 处女av在线| av一区二区三区在线 | 亚洲国产成人久久 | 国产精品嫩草69影院 | 在线观看一级 | 欧美日韩大片在线观看 | 日本动漫做毛片一区二区 | 在线激情小视频 | 一本一本久久a久久精品牛牛影视 | 成人黄在线| 狠狠狠色丁香婷婷综合久久五月 | 久草视频在线资源站 | av中文字幕在线播放 | 成人免费ⅴa| 国产精品久久久久久久久软件 | 国产视频高清 | 亚洲一级电影在线观看 | 九九在线视频免费观看 | 色婷婷久久久综合中文字幕 | 亚洲黄色在线免费观看 | 狠狠色丁香婷婷综合欧美 | japanesexxx乱女另类 | 久久成熟| 成人av在线网址 | 在线观看av小说 | 夜夜天天干 | 国产精品福利无圣光在线一区 | 久草在线久草在线2 | 91精品国产99久久久久久久 | 激情婷婷亚洲 | 中文字幕一区二区三区在线播放 | 国产在线一区二区 | 久久成人综合视频 | 久久精品韩国 | 91九色蝌蚪国产 | 久久久久www | 黄色a一级片 | 97国产精品久久 | 黄色成人av | 国产精品专区h在线观看 | 国产精品成人一区二区三区吃奶 | 97在线免费视频观看 | 欧美另类交人妖 | 天天天色 | 免费看av在线 | 天天草综合网 | 亚洲视频观看 | 麻豆传媒视频在线播放 | 天天天操天天天干 | 久久免费看片 | 亚洲国产日韩在线 | 国产一区高清在线 | 天天做日日做天天爽视频免费 | 91视频这里只有精品 | 在线 精品 国产 | 青草视频网 | 天天草av | 国产美女主播精品一区二区三区 | 成人午夜黄色 | 亚洲特级毛片 | 成人av教育| 午夜精品福利在线 | av成人免费观看 | 激情欧美丁香 | 婷婷成人综合 | 天天操天天操天天干 | 国产成人一区二区三区在线观看 | 久久免费高清 | 欧美精品久久久久久久免费 | 亚洲精品午夜久久久久久久 | 97视频在线观看免费 | 91污视频在线观看 | 日韩免费在线网站 | 国产精品免费一区二区三区在线观看 | 欧美婷婷综合 | 国产精品久久久久影院日本 | 二区视频在线观看 | 99视频在线看 | 欧美日韩视频在线观看免费 | 夜夜操狠狠操 | 中文字幕在线视频一区 | www久久九| 中文字幕精品视频 | 91在线入口 | 综合久久影院 | 久久人人97超碰精品888 | 黄色aaa级片 | 国产资源站 | 午夜精品福利在线 | www91在线观看 | 久久免费视频4 | 亚洲国产免费网站 | 免费看一级一片 | 成人三级av | 精品久久亚洲 | 九九久久久久久久久激情 | 亚洲视频电影在线 | 久久久久久久99精品免费观看 | 欧美性猛片, | 亚欧日韩av | 国产aa精品 | www.eeuss影院av撸 | 国产丝袜制服在线 | 韩日精品视频 | 中文字幕中文 | 久久综合9988久久爱 | 日韩高清一 | 久草在线免 | 国产精品成人av电影 | 亚洲人在线视频 | 久久 亚洲视频 | 亚洲乱码精品 | 黄色一级免费电影 | 欧美va日韩va | 久草电影网 | 天天碰天天操视频 | 免费成视频 | 欧洲视频一区 | 超碰免费97 | 黄色的网站在线 | 精品国产1区 | 又色又爽的网站 | 国产日韩在线看 | 中文字幕一区二区在线观看 | 国产精品毛片一区视频播不卡 | 特级黄色视频毛片 | av九九九| 亚洲精品乱码久久久久久9色 | 在线免费视频你懂的 | 色综合久久久 | 中国黄色一级大片 | 中文字幕av最新 | 人人艹人人 | 午夜.dj高清免费观看视频 | 免费色av| 免费看黄在线 | 欧美一区二区伦理片 | 色99色 | 人人干狠狠干 | 国产精品视频不卡 | 91精品综合| 在线观看深夜视频 | 国产亚洲精品久久久久久 | 97视频免费在线观看 | 在线观看视频中文字幕 | 日日噜噜噜噜夜夜爽亚洲精品 | 日本性xxxxx 亚洲精品午夜久久久 | 天天操天天干天天摸 | 夜色.com| 日韩最新理论电影 | 国产精品久久久毛片 | 看片网站黄色 | 亚洲免费观看在线视频 | 九九久久久久99精品 | 四虎成人在线 | 久久国产色 |