6 SysUtils, Classes, Controls, Forms, IdHTTP, IdComponent,
7 HTTPApp, GikoSystem, BoardGroup, ItemDownload;
10 TThreadControl = class(TThread)
12 FItemList: TThreadList; //
\83_
\83E
\83\93\83\8d\81[
\83h
\82·
\82é
\83A
\83C
\83e
\83\80\82ð
\8ai
\94[
\82·
\82é
\83\8a\83X
\83g
13 FAbort: Boolean; //
\92\86\92f
\83t
\83\89\83O
14 FThreadList: TList; //
\8eÀ
\8dÛ
\82É
\83_
\83E
\83\93\83\8d\81[
\83h
\82·
\82é
\83X
\83\8c\83b
\83h
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\83\8a\83X
\83g
15 FMaxThreadCount: Integer; //
\8dÅ
\91å
\83X
\83\8c\83b
\83h
\90\94
16 FOnWork: TGikoWorkEvent;
17 FOnWorkBegin: TGikoWorkBeginEvent;
18 FOnWorkEnd: TGikoWorkEndEvent;
19 FOnDownloadEnd: TDownloadEndEvent;
20 FOnDownloadMsg: TDownloadMsgEvent;
21 procedure WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer; Number: Integer);
22 procedure WorkEnd(Sender: TObject; AWorkMode: TWorkMode; Number: Integer);
23 procedure Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer; Number: Integer);
24 procedure DownloadEnd(Sender: TObject; Item: TDownloadItem);
25 procedure DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
26 procedure SetMaxThreadCount(Count: Integer);
28 procedure Execute; override;
30 constructor Create(CreateSuspended: Boolean);
31 destructor Destroy; override;
32 procedure AddItem(Item: TDownloadItem);
33 function GetSuspendThread: TDownloadThread;
34 function GetActiveThreadCount: Integer;
35 procedure DownloadAbort;
36 property MaxThreadCount: Integer read FMaxThreadCount write SetMaxThreadCount;
37 property OnWork: TGikoWorkEvent read FOnWork write FOnWork;
38 property OnWorkBegin: TGikoWorkBeginEvent read FOnWorkBegin write FOnWorkBegin;
39 property OnWorkEnd: TGikoWorkEndEvent read FOnWorkEnd write FOnWorkEnd;
40 property OnDownloadEnd: TDownloadEndEvent read FOnDownloadEnd write FOnDownloadEnd;
41 property OnDownloadMsg: TDownloadMsgEvent read FOnDownloadMsg write FOnDownloadMsg;
46 constructor TThreadControl.Create(CreateSuspended: Boolean);
48 inherited Create(CreateSuspended);
49 FItemList := TThreadList.Create;
50 FThreadList := TList.Create;
55 destructor TThreadControl.Destroy;
59 for i := 0 to FThreadList.Count - 1 do begin
60 TDownloadThread(FThreadList[i]).Free;
67 procedure TThreadControl.AddItem(Item: TDownloadItem);
72 procedure TThreadControl.Execute;
76 FDownThread: TDownloadThread;
78 while not Terminated do begin
80 List := FItemList.LockList;
82 if List.Count > 0 then begin
83 FDownThread := GetSuspendThread;
84 if FDownThread <> nil then begin
85 FDownThread.Item := TDownloadItem(List.Items[0]);
94 for i := 0 to FThreadList.Count - 1 do begin
95 if not TDownloadThread(FThreadList[i]).Suspended then
96 TDownloadThread(FThreadList[i]).Abort;
98 List := FItemList.LockList;
102 FItemList.UnlockList;
107 for i := 0 to FThreadList.Count - 1 do begin
108 TDownloadThread(FThreadList[i]).Terminate;
109 if TDownloadThread(FThreadList[i]).Suspended then
110 TDownloadThread(FThreadList[i]).Resume;
115 function TThreadControl.GetSuspendThread: TDownloadThread;
118 DownloadThread: TDownloadThread;
121 if GetActiveThreadCount >= FMaxThreadCount then Exit;
122 for i := 0 to FThreadList.Count - 1 do begin
123 if TDownloadThread(FThreadList[i]).Suspended then begin
124 Result := TDownloadThread(FThreadList[i]);
128 if (Result = nil) and (FMaxThreadCount > FThreadList.Count) then begin
129 DownloadThread := TDownloadThread.Create(True);
130 DownloadThread.FreeOnTerminate := False;
131 DownloadThread.Number := FThreadList.Count;
132 DownloadThread.OnWorkBegin := WorkBegin;
133 DownloadThread.OnWorkEnd := WorkEnd;
134 DownloadThread.OnWork := Work;
135 DownloadThread.OnDownloadEnd := DownloadEnd;
136 DownloadThread.OnDownloadMsg := DownloadMsg;
137 FThreadList.Add(DownloadThread);
138 Result := DownloadThread;
142 function TThreadControl.GetActiveThreadCount: Integer;
147 for i := 0 to FThreadList.Count - 1 do begin
148 if not TDownloadThread(FThreadList[i]).Suspended then
153 procedure TThreadControl.DownloadAbort;
158 procedure TThreadControl.SetMaxThreadCount(Count: Integer);
160 if FMaxThreadCount = Count then Exit;
161 if Count <= 0 then Count := 1;
162 if Count > 10 then Count := 10;
163 FMaxThreadCount := Count;
166 procedure TThreadControl.WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer; Number: Integer);
168 if Assigned(OnWorkBegin) then
169 OnWorkBegin(Sender, AWorkMode, AWorkCountMax, Number);
172 procedure TThreadControl.WorkEnd(Sender: TObject; AWorkMode: TWorkMode; Number: Integer);
174 if Assigned(OnWorkEnd) then
175 OnWorkEnd(Sender, AWorkMode, Number);
178 procedure TThreadControl.Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer; Number: Integer);
180 if Assigned(OnWork) then
181 OnWork(Sender, AWorkMode, AWorkCount, Number);
184 procedure TThreadControl.DownloadEnd(Sender: TObject; Item: TDownloadItem);
186 if Assigned(OnDownloadEnd) then
187 OnDownloadEnd(Sender, Item);
190 procedure TThreadControl.DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
192 if Assigned(OnDownloadMsg) then
193 OnDownloadMsg(Sender, Item, Msg, Icon);