?? threadtask.pas
字號:
{*******************************************************}
{ }
{ 高級線程 }
{ 單元名 ThreadTask.pas }
{ }
{ 版權所有 (C) 2006-6-25 飛翔的久久酷 }
{ http://www.flying99koo.com }
{ QQ:78273318 Mail: flying99koo@gmail.com }
{ }
{*******************************************************}
unit ThreadTask;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, StdCtrls, ComCtrls;
type
TThreadTask = class(TThread) //基礎線程任務類
private
_PAUSE_FLAG : boolean;
procedure NotifyPool; //線程池通知方法
protected
procedure PauseHere; //由子類使用,設置暫停點
procedure Relay(sec : Byte); //延時方法
procedure Execute; override;
procedure InitJob; virtual; //用于創建所需要的類以及類的初始化
procedure DoneJob; virtual; //用于銷毀創建的類
procedure DoJob; virtual;abstract;
public
_THREAD_LIST : TThreadList; //線程列表,用于線程池
_TASK_INDEX : Integer; //任務索引,用于線程池
procedure Pause; //暫停
procedure Goon; //繼續
procedure Stop; virtual; //停止
constructor Create;
end;
TTraceLogNotifyEvent = procedure(Log : string; Sender: TObject) of object;
TLvTraceLogNotifyEvent = procedure(Log : string; Row : Integer; Column : Byte; ImgIdx : SmallInt; Sender: TObject) of object;
TAdvThreadTask = class(TThreadTask) //具有TRACE功能的線程任務
protected
procedure TraceLog(Log : string); //listbox方式 Trace 方法
procedure LvTraceLog(Log : string; Row : Integer; Column : Byte; ImgIdx : SmallInt); //listview 方式 Trace 方法
public
_OnTraceLog : TTraceLogNotifyEvent;
_OnLvTraceLog : TLvTraceLogNotifyEvent;
end;
TNetWorkThreadTask = class(TAdvThreadTask) //網絡協議線程任務
protected
procedure CreateProtocal;virtual;abstract; //創建網絡協議類
procedure FreeProtocal;virtual;abstract; //銷毀網絡協議類
procedure InitProtocal;virtual;abstract; //初始化網絡協議
procedure ReCreateProtocal; //重創網絡協議并初始化
procedure DoJob; override;
procedure DoNetWorkJob;virtual;abstract;
public
procedure Stop; override;
end;
TProgressNotifyEvent = procedure(Min, Max, Progress : Integer; Sender: TObject) of object;
TLoopNetWorkThreadTask = class(TNetWorkThreadTask) //循環型網絡協議線程任務
protected
_LOOP_INDEX : Integer; //循環索引
_JUMP_FLAG : Boolean; //跳出循環標志
procedure DoNetWorkJob; override;
procedure DoLoopNetWorkJob; virtual;abstract; //實際任務實體 由子類覆蓋
public
_RELAY : Integer;
_LOOP_COUNT : Integer;
_OnProgress : TProgressNotifyEvent;
constructor Create;
end;
implementation
uses
ThreadPool, HTTPutil;
{TThreadTask}
constructor TThreadTask.Create;
begin
inherited Create(TRUE);
FreeOnTerminate := TRUE;
_THREAD_LIST := nil;
_TASK_INDEX := -1;
end;
procedure TThreadTask.Execute;
begin
InitJob;
Dojob;
DoneJob;
NotifyPool;
end;
procedure TThreadTask.DoneJob;
begin
end;
procedure TThreadTask.InitJob;
begin
end;
procedure TThreadTask.NotifyPool;
var
i : Integer;
begin
if _THREAD_LIST <> nil then
with _THREAD_LIST.LockList do
try
for i:=0 to Count-1 do
if TThreadObj(Items[i]^).Handle = Self.Handle then
begin
TThreadObj(Items[i]^).Active := False;
Break;
end;
finally
_THREAD_LIST.UnlockList;
end;
end;
procedure TThreadTask.PauseHere;
begin
if _PAUSE_FLAG then Self.Suspend;
end;
procedure TThreadTask.Pause;
begin
_PAUSE_FLAG := TRUE;
end;
procedure TThreadTask.Goon;
begin
_PAUSE_FLAG := FALSE;
Self.Resume;
end;
procedure TThreadTask.Stop;
begin
DoneJob;
TerminateThread(Self.Handle,0);
end;
procedure TThreadTask.Relay(sec : Byte);
var
i : Integer;
begin
for i:=1 to 10*sec do
begin
if _PAUSE_FLAG then break;
Sleep(100);
end;
end;
{TAdvThreadTask}
procedure TAdvThreadTask.TraceLog(Log : string);
begin
if Assigned(_OnTraceLog) then
_OnTraceLog(Log,Self);
end;
procedure TAdvThreadTask.LvTraceLog(Log : string; Row : Integer; Column : Byte; ImgIdx : SmallInt);
begin
if Assigned(_OnLvTraceLog) then
_OnLvTraceLog(Log,Row,Column,ImgIdx,Self);
end;
{TNetWorkThreadTask}
procedure TNetWorkThreadTask.ReCreateProtocal;
begin
FreeProtocal;
CreateProtocal;
InitProtocal;
end;
procedure TNetWorkThreadTask.DoJob;
begin
CreateProtocal;
InitProtocal;
DoNetWorkJob;
FreeProtocal;
end;
procedure TNetWorkThreadTask.Stop;
begin
FreeProtocal;
inherited;
end;
{TLoopNetWorkThreadTask}
constructor TLoopNetWorkThreadTask.Create;
begin
inherited;
_LOOP_COUNT := 1;
_LOOP_INDEX := 1;
_JUMP_FLAG := False;
end;
procedure TLoopNetWorkThreadTask.DoNetWorkJob;
var
i : Integer;
begin
for i:=1 to _LOOP_COUNT do
begin
_LOOP_INDEX := i;
DoLoopNetWorkJob;
if Assigned(_OnProgress) then
_OnProgress(0,_LOOP_COUNT,_LOOP_INDEX,Self);
if _JUMP_FLAG then
Break;
if i<>_LOOP_COUNT then
Relay(_RELAY);
PauseHere;
end;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -