Bonjour à tous

Je vous explique brièvement mon problème :
Je parcours un range d'adresse IP. Je dois faire un Ping sur chaque adresse.
Je veux gérer celà dans un Thread qui me permettra d'avoir la main sur mon programme et aussi pour que je puisse arrêter à tout moment mon application.
La fonction PingHost(Host); fonctionne très bien dans une Unit mais dans le Thread elle me pose des problème...
Mon applic ne plante pas mais en mode pas-à-pas je remarque qu'il ne passe pas la valeur du Host. Il me met : "Host = Symbol was eliminated by linker".

Voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
type
  ThreadScanIP = class(TThread)
  private
    FProgressForm: TfrmProgressBar;
  protected
    procedure Execute; override;
    procedure OnTerminateProcedure(Sender: TObject);
  public
    procedure PingHost(Host: string);
    constructor Create(Suspended: Boolean);
  end;
 
implementation
 
 
constructor ThreadScanIP.Create(Suspended: Boolean);
begin
  FreeOnTerminate := True;
  inherited Create(Suspended);
  FProgressForm := TfrmProgressBar.Create(nil);
  FProgressForm.Show;
  OnTerminate := OnTerminateProcedure;
end;
 
procedure ThreadScanIP.Execute;
var
  StartIP, EndIP, i, Count: Integer;
  InAddr: TInAddr;
begin
  frmMain.btnValider.Enabled := False;
  Count := 0;
  FProgressForm.ProgressBar.Max := frmMain.CountIP;
  StartIP := ntohl(inet_addr(PChar(frmMain.IPs)));
  EndIP := ntohl(inet_addr(PChar(frmMain.IPe)));
  frmMain.richedit1.Enabled := False;
  frmMain.richedit1.Clear;
  for i := StartIP to EndIP do //Parcours le range d'adresse IP définit
  begin
    if (i and 255) <> 0 then
    begin
      InAddr.S_addr := htonl(i);
      frmMain.RichEdit1.Lines.Add(inet_ntoa(InAddr)); //adresse IP parcourue
      PingHost(inet_ntoa(InAddr));
      FProgressForm.ProgressBar.Position := Count;
      Inc(Count);
    end;
  end;
  frmMain.richedit1.Enabled := True;
  MessageBox(0, 'Traitement des adresses terminé', 'Scanning IP', MB_OK);
  frmMain.btnValider.Enabled := True;
end;
 
procedure ThreadScanIP.OnTerminateProcedure(Sender: TObject);
begin
  if Assigned(FProgressForm) then
    FProgressForm.Release;
end;
 
procedure ThreadScanIP.PingHost(Host: string);
var
  IdIcmpClient: TIdIcmpClient;
begin
  IdIcmpClient := TIdIcmpClient.Create(nil);
  with IdIcmpClient do
  begin
    try
      Host := Host;
      ReceiveTimeout := StrToInt(frmOptions.edtTimeOut.Text);
      TTL := StrToInt(frmOptions.edtTTL.Text);
      BufferSize := StrToInt(frmOptions.edtBufferSize.Text);
      Ping;
      case ReplyStatus.ReplyStatusType of
        rsEcho:
          begin
            frmMain.lbLog.Items.Append(format('response from host %s in %d millisec.',
              [
              ReplyStatus.FromIpAddress,
                ReplyStatus.MsRoundTripTime
                ]));
          end;
        rsError:
          frmMain.lbLog.Items.Append('Unknown error.');
        rsTimeOut:
          frmMain.lbLog.Items.Append('Timed out.');
        rsErrorUnreachable:
          frmMain.lbLog.Items.Append(format('Host %s reports destination network unreachable.',
            [ReplyStatus.FromIpAddress]));
        rsErrorTTLExceeded:
          frmMain.lbLog.Items.Append(format('Hope %d %s: TTL expired.',
            [TTL,
            ReplyStatus.FromIpAddress]));
      end;
    finally
      Free;
    end;
  end;
end;