📄 mythreadpool.pas
字号:
unit MyThreadPool;
interface
uses
SysUtils, ThreadPool, MyHTTPtask, ThreadTask;
type
{used in demo1}
TThreadPoolDemo = class(TThreadPool) ///普通任务线程池类从 TThreadPool 继承即可
protected
procedure SetThread(ThreadIndex : Integer; Task : Pointer);override; //通常情况下你只需要覆盖父类中的这个方法即可
public
P_OnLvTraceLog : TLvTraceLogNotifyEvent;
P_OnTraceLog : TTraceLogNotifyEvent;
end;
{用于验证代理的HTTP线程池类 used in demo2}
TCheckProxyPool = class(THTTPtaskPool) //创建HTTP线程池请从 THTTPtaskPool 继承
protected
procedure SetThread(ThreadIndex : Integer; Task : Pointer);override;
public
P_OnLvTraceLog : TLvTraceLogNotifyEvent;
P_READ_TIME_OUT : Integer;
P_TARGET_URL : string;
P_SUCC_STR : string;
end;
{used in demo3}
TWebSearchPool = class(THTTPtaskPool)
protected
procedure SetThread(ThreadIndex : Integer; Task : Pointer);override;
procedure CreateThread(ThreadIndex : Integer ; Task : Pointer);override; //demo3中多覆盖了父类中的一个方法,因为我们需要使用多态
public
P_OnSrhRetFind : TSrhRetFindEvent;
P_KEY_WORD : string;
P_PAGE_NUM : Integer;
end;
implementation
uses
Main, Define;
{TThreadPoolDemo}
procedure TThreadPoolDemo.SetThread(ThreadIndex : Integer; Task : Pointer);
var
TaskObj : PTaskObj;
begin
with TThreadTaskDemo(_THREADS[ThreadIndex]) do
begin
TaskObj := PTaskObj(Task);
_PARAM := PDemoParam(TaskObj^.Param)^.Relay; //设置延时
_OnTraceLog := P_OnTraceLog; //ListBox 方式状态跟踪事件
_OnLvTraceLog := P_OnLvTraceLog; //Listview 方式状态跟踪事件 (用于在界面上显示每个线程的状态)
end;
end;
{TCheckProxyPool}
procedure TCheckProxyPool.SetThread(ThreadIndex : Integer; Task : Pointer);
var
TaskObj : PTaskObj;
begin
inherited; //从 THTTPtaskPool 继承别忘了加上这句
with TCheckProxy(_THREADS[ThreadIndex]) do
begin
TaskObj := PTaskObj(Task);
_USE_PROXY := True;
_PROXY_ADDR := StrPas(PCheckProxyParam(TaskObj^.Param)^.IP); //代理IP
_PROXY_PORT := PCheckProxyParam(TaskObj^.Param)^.Port; //代理端口
_CONN_TIME_OUT := 5000; //连接超时,即DNS解析超时,这里我们设置为固定的5秒
_OnLvTraceLog := P_OnLvTraceLog; //Listview 方式状态跟踪事件 (用于在界面上显示每个线程的状态)
_READ_TIME_OUT := P_READ_TIME_OUT; //HTTP请求超时
_TARGET_URL := P_TARGET_URL; //目标验证网址
_SUCC_STR := P_SUCC_STR; //成功字串
end;
end;
{TWebSearchPool}
procedure TWebSearchPool.SetThread(ThreadIndex : Integer; Task : Pointer);
var
TaskObj : PTaskObj;
begin
inherited;
with TWebSearch(_THREADS[ThreadIndex]) do
begin
TaskObj := PTaskObj(Task);
_TASK_INDEX := TaskObj^.Index;
_KEYWORD := P_KEY_WORD ;
_PAGE_COUNT := P_PAGE_NUM;
_READ_TIME_OUT := 5000;
_CONN_TIME_OUT := 5000;
_OnSrhRetFind := P_OnSrhRetFind;
end;
end;
procedure TWebSearchPool.CreateThread(ThreadIndex : Integer ; Task : Pointer);
var
TaskObj : PTaskObj;
EngineSite : TWebEngine;
begin
with TWebSearch(_THREADS[ThreadIndex]) do
begin
TaskObj := PTaskObj(Task);
EngineSite := PWebEngineObj(TaskObj^.Param)^.Site;
//来体会一下多态的奥妙,现在TWebSearchPool能运行完全不同的任务,而不仅仅是任务参数不同而已
case EngineSite of
weGoogle : _THREADS[ThreadIndex] := TGoogleSearch.Create;
weBaidu : _THREADS[ThreadIndex] := TBaiduSearch.Create;
weYahoo : _THREADS[ThreadIndex] := TYahooSearch.Create;
weSina : _THREADS[ThreadIndex] := TSinaSearch.Create;
weSogou : _THREADS[ThreadIndex] := TSogouSearch.Create;
weZhongSou : _THREADS[ThreadIndex] := TChinaSearch.Create;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -