Je suis pas un grand spécialiste dans les Threads
Merci pour votre aide :) donc j'ai tester se code si dessous mais cela ne change en rien a la vitesse de traitement des URL
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
var
Form1: TForm1;
Controle: String;
ResultCtrl: Boolean;
IdHTTP: TIdHTTP;
implementation
{$R *.dfm}
procedure TMyThread.Execute;
begin
ResultCtrl := False;
if Terminated then Exit;
try
IdHTTP.Head(Controle);
ResultCtrl := True;
except
ResultCtrl := False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
LThread: TMyThread;
begin
LThread := TMyThread.Create(True);
IdHTTP := TIdHTTP.Create(nil);
for I := 0 to Memo1.Lines.Count - 1 do
begin
Controle := Memo1.Lines.Strings[I];
LThread.Execute;
if ResultCtrl = False then
begin
Showmessage('Error :' + Memo1.Lines.Strings[I]);
end;
end;
LThread.Free;
IdHTTP.Free;
end; |
:?
Essayer aussi de jouer avec un timeout si le serveur n'est pas accessible.
Oui cela est intéressent , ReadTimeout mais quel est la valeur minimum que je pourrai maitre (100) Trop juste (1500) Trop long mais avec un résultat 100% OK. :D
Combien de temps il faut pour savoir si URL est valide ou pas ? Merci ;)
Contrôle Url multi thread
Pièce jointe 166340Bonjour a tous,
Grasse a 2 Threads je viens de diviser le temps de traitement par 2 :D
Tout les URL html son dans un fichier Xml séparer d'un #13 exemple: (http://www.AAA.html#13http://www.BBB.html)...
Voici le code si dessous
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var
FCtrlHtml: TFCtrlHtml;
IdThread1, IdThread2: TIdhttp;
Thread1, Thread2: Cardinal;
HandleThread1, HandleThread2: Integer;
TabThread1: Array of String;
TabThread2: Array of String;
IArray: Array[1..2] of Integer;
implementation
{$R *.dfm} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| {Thread N°1}
procedure TThread1;
var
I: Integer;
begin
IdThread1 := TIdHttp.Create(nil);
FCtrlHtml.GThread1.MaxValue := Length(TabThread1);
for I := Low(TabThread1) to High(TabThread1) do
begin
FCtrlHtml.LabThread1.Caption := TabThread1[I];
try
IdThread1.Head(TabThread1[I]);
except
FCtrlHtml.ListErr.Lines.Add('Thread N° 1 : ' + TabThread1[I]);
end;
FCtrlHtml.GThread1.Progress := FCtrlHtml.GThread1.Progress +1;
FCtrlHtml.GThread1.Suffix := '% | ' + IntToStr(FCtrlHtml.GThread1.Progress) + ' / ' + IntToStr(Length(TabThread1));
end;
TerminateThread(HandleThread1 ,0);
IdThread1.Free;
end; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| {Thread N°2}
procedure TThread2;
var
I: Integer;
begin
IdThread2 := TIdHttp.Create(nil);
FCtrlHtml.GThread2.MaxValue := Length(TabThread2);
for I := Low(TabThread2) to High(TabThread2) do
begin
FCtrlHtml.LabThread2.Caption := TabThread2[I];
try
IdThread2.Head(TabThread2[I]);
except
FCtrlHtml.ListErr.Lines.Add('Thread N° 2 : ' + TabThread2[I]);
end;
FCtrlHtml.GThread2.Progress := FCtrlHtml.GThread2.Progress +1;
FCtrlHtml.GThread2.Suffix := '% | ' + IntToStr(FCtrlHtml.GThread2.Progress) + ' / ' + IntToStr(Length(TabThread2));
end;
TerminateThread(HandleThread2 ,0);
IdThread2.Free;
end; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| {Démarrer le contrôle}
procedure TFCtrlHtml.BtnStartThreadClick(Sender: TObject);
var
ListHtml, Html: TStringList;
I, RcCount, DivRc: Integer;
begin
BtnStartThread.Enabled := False;
BtnStopThread.Enabled := True;
RcCount := 0;
ListHtml := TStringList.Create;
Html := TStringList.Create;
DataSetXml.Active := True;
with DataSetXml do
while not Eof do
begin
ListHtml.Text := FieldByName('Html').Value;
for I := 0 to ListHtml.Count - 1 do
begin
Html.Add(ListHtml.Strings[I]);
end;
RcCount := RcCount + ListHtml.Count;
Stat.Panels[1].Text := IntTostr(RcCount);
ListHtml.Clear;
I := 0;
Next;
end;
DataSetXml.Active := False;
ListHtml.Free;
I := 0;
DivRc := RcCount div 2; {Divise la liste des URL en 2}
for I := 0 to DivRc do
begin {Liste url Html N°1}
SetLength(TabThread1, IArray[1] +1);
TabThread1[IArray[1]] := Html.Strings[I];
Inc(IArray[1]);
end;
Stat.Panels[3].Text := IntTostr(Length(TabThread1));
I := 0;
Inc(DivRc);
for I := DivRc to Html.Count - 1 do
begin {Liste url Html N°2}
SetLength(TabThread2, IArray[2] +1);
TabThread2[IArray[2]] := Html.Strings[I];
Inc(IArray[2]);
end;
Stat.Panels[5].Text := IntTostr(Length(TabThread2));
Html.Free;
{Créer le Thread N°1}
HandleThread1 := BeginThread(nil, 1024, @TThread1, nil, 0, Thread1);
SetThreadPriority(HandleThread1, THREAD_PRIORITY_HIGHEST);
{Créer le Thread N°2}
HandleThread2 := BeginThread(nil, 1024, @TThread2, nil, 0, Thread2);
SetThreadPriority(HandleThread2, THREAD_PRIORITY_HIGHEST);
end; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| {Arrêter le contrôle}
procedure TFCtrlHtml.BtnStopThreadClick(Sender: TObject);
begin
TerminateThread(HandleThread1 ,0);
TerminateThread(HandleThread2 ,0);
IdThread1.Free;
IdThread2.Free;
ListErr.Clear;
GThread1.Progress := 0;
GThread2.Progress := 0;
LabThread1.Caption := '...';
LabThread2.Caption := '...';
BtnStartThread.Enabled := True;
BtnStopThread.Enabled := False;
end; |
Code:
1 2 3 4 5
| {A la fermeture du form}
procedure TFCtrlHtml.FormClose(Sender: TObject; var Action: TCloseAction);
begin
BtnStopThreadClick(Self);
end; |
Code:
1 2 3 4 5
| {Compte le nombre d'url invalide}
procedure TFCtrlHtml.ListErrChange(Sender: TObject);
begin
Stat.Panels[7].Text := IntToStr(ListErr.Lines.Count);
end; |
Voila maintenant j'aimerai créer un Thread qui peu traiter 10 URL ou plus d'un coup , je pence que la méthode ne dois pas être la même ?
Merci de votre réponse.
SplitString n'est pas reconnue par Delphi 2010
Merci Andnotor pour l'info :D , Par contre SplitString n'est pas reconnue par Delphi 2010 :? donc je vais replacer cette par partir par un tableau dynamique avec tout les Url en une liste, Dans quel partie du programme je pourrai voir la progression général des url traiter par les Threads ?
Est encore Merci :D