OSDN Git Service

過去ログのHTMLで、"投稿日:"が":"だけになっているものに対応
[gikonavigoeson/gikonavi.git] / ItemDownload.pas
index 10027ad..b005725 100644 (file)
@@ -6,7 +6,7 @@ uses
        Windows, SysUtils, Classes, ComCtrls, Controls, Forms, IdHTTP,
        {HTTPApp,} YofUtils, IdGlobal, IdException, IdComponent, IniFiles, {DateUtils,}
        GikoSystem, BoardGroup, ExternalBoardManager, ExternalBoardPlugInMain,
-       Sort;
+       Sort, SyncObjs;
 
 type
        TDownloadItem = class;
@@ -27,7 +27,17 @@ type
                FErrText: string;
        end;
 
-
+       TWorkData = record
+           //FWorkCS: TCriticalSection;
+               //IdHttp\82ÌOnWork\81AOnWorkBegin,OnWorkEnd\82Í\95Ê\82Ì\83X\83\8c\83b\83h\82©\82ç
+        //\8cÄ\82Î\82ê\82é\88×\81ASynchronize\82Å\93¯\8aú\82·\82é\95K\97v\82ª\82 \82é\81B
+               //\83N\83\8a\83e\83B\83J\83\8b\83Z\83N\83V\83\87\83\93\82Í\96³\82­\82Ä\82à\82½\82Ô\82ñ\95½\8bC\82¾\82¯\82Ç\97p\90S\82Ì\88×\81B by eggcake
+               FWorkCS: TCriticalSection;
+               FSender: TObject;
+               FAWorkMode: TWorkMode;
+               FAWorkCount: Integer;
+               FAWorkCountMax: Integer
+       end;
        TDownloadThread = class(TThread)
        private
                FIndy: TIdHttp;
@@ -43,6 +53,7 @@ type
                FOnDownloadEnd: TDownloadEndEvent;
                FOnDownloadMsg: TDownloadMsgEvent;
                FDownloadTitle: string;
+        FWorkData: TWorkData;
 
                procedure FireDownloadEnd;
                procedure FireDownloadMsg;
@@ -56,7 +67,10 @@ type
                procedure DeleteStatusLine(Item: TDownloadItem);
                procedure InitHttpClient(client: TIdHttp);
                procedure ClearHttpClient(client: TIdHttp);
-       protected
+               procedure FireWork;
+               procedure FireWorkBegin;
+               procedure FireWorkEnd;
+       protected
                procedure Execute; override;
        public
                property Item: TDownloadItem read FItem write FItem;
@@ -111,6 +125,8 @@ uses
 constructor TDownloadThread.Create(CreateSuspended: Boolean);
 begin
        inherited Create(CreateSuspended);
+    FWorkData.FWorkCS := TCriticalSection.Create;
+
        FIndy := TIdHttp.Create(nil);
 
        FIndy.OnWorkBegin := WorkBegin;
@@ -122,6 +138,7 @@ destructor TDownloadThread.Destroy;
 begin
        ClearHttpClient(FIndy);
        FIndy.Free;
+    FWorkData.FWorkCS.Free;
        inherited;
 end;
 
@@ -814,22 +831,72 @@ begin
        end;
 end;
 
-procedure TDownloadThread.WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
+procedure TDownloadThread.WorkBegin(Sender: TObject;
+AWorkMode: TWorkMode; const AWorkCountMax: Integer);
+begin
+       if Assigned(OnWorkBegin) then begin
+               FWorkData.FWorkCS.Acquire;
+               try
+                       FWorkData.FSender := Sender;
+                       FWorkData.FAWorkMode := AWorkMode;
+                       FWorkData.FAWorkCountMax := AWorkCountMax;
+                       Synchronize(FireWorkBegin);
+               finally
+                       FWorkData.FWorkCS.Release;
+               end;
+       end;
+end;
+
+procedure TDownloadThread.WorkEnd(Sender: TObject;
+AWorkMode: TWorkMode);
+begin
+       if Assigned(OnWorkEnd) then begin;
+               FWorkData.FWorkCS.Acquire;
+               try
+                       FWorkData.FSender := Sender;
+                       FWorkData.FAWorkMode := AWorkMode;
+                       Synchronize(FireWorkEnd);
+               finally
+                       FWorkData.FWorkCS.Release;
+               end;
+       end;
+end;
+
+procedure TDownloadThread.Work(Sender: TObject; AWorkMode:
+TWorkMode; const AWorkCount: Integer);
+begin
+       if Assigned(OnWork) then begin
+               FWorkData.FWorkCS.Acquire;
+               try
+                       FWorkData.FSender := Sender;
+                       FWorkData.FAWorkMode := AWorkMode;
+                       FWorkData.FAWorkCount := AWorkCount;
+                       Synchronize(FireWork);
+               finally
+                       FWorkData.FWorkCS.Release;
+               end;
+       end;
+end;
+
+//\82±\82±\82©\82ç\90V\8bK\83\81\83\\83b\83h
+procedure TDownloadThread.FireWorkBegin;
 begin
-       if Assigned(OnWorkBegin) then
-               OnWorkBegin(Sender, AWorkMode, AWorkCountMax, FNumber, FDownloadTitle);
+       OnWorkBegin(FWorkData.FSender, FWorkData.FAWorkMode,
+        FWorkData.FAWorkCountMax,
+               FNumber, FDownloadTitle);
 end;
 
-procedure TDownloadThread.WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
+procedure TDownloadThread.FireWorkEnd;
 begin
-       if Assigned(OnWorkEnd) then
-               OnWorkEnd(Sender, AWorkMode, FNumber);
+       OnWorkEnd(FWorkData.FSender, FWorkData.FAWorkMode,
+               FNumber);
 end;
 
-procedure TDownloadThread.Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
+procedure TDownloadThread.FireWork;
 begin
-       if Assigned(OnWork) then
-               OnWork(Sender, AWorkMode, AWorkCount, FNumber);
+       OnWork(FWorkData.FSender, FWorkData.FAWorkMode,
+        FWorkData.FAWorkCount,
+               FNumber);
 end;
 
 function TDownloadThread.ParseCgiStatus(Content: string): TCgiStatus;