我有一台设备A,是TCP/IP连接的。此设备要密码A才能进入到管理界面。设备的SDK有一个清除密码的函数,可以用来清除设备的管理权限。现在的问题是我不知道此设备的具体IP地址。只知道是在192.168.1.2至192.168.1.254之间,
为了清除设备上的密码,我目前使用的是for i:=1 to 254 do 的循环。这样子太慢了,
每个IP都要尝试连接,每个IP大约要耗时20秒才知道成不成功我能不能将这个做成多线程的。开它几十上百个线程。具体要怎么设计啊,我目前的代码如下:(太慢了啊)for i:= 1 to 254 do
begin
  IpAdd := '192.168.1.' + inttostr(i);
  if DevClearPassword(IpAdd) = true
  begin
    break;
  end
end多线程要怎么做?

解决方案 »

  1.   

    我觉得用线程做,也是一样的费时间,而且还绕了个弯。
    你的IP是在192.168.1.2至192.168.1.254之间,不可能每一个IP都有连设备吧?
    那就先把连接有设备的IP找出来(这个应该能容易点吧),得到一个子集,
    然后再用你的方法遍历这个子集
      

  2.   

    var
      b: Boolean = False;
      cs: TRTLCriticalSection;
      ip: array of Integer;procedure f(p: Pointer); stdcall;
    begin
      EnterCriticalSection(cs);
      if not b then
        b := DevClearPassword('192.168.1.' + IntToStr(Integer(p^)));
      LeaveCriticalSection(cs);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      dw: array[0..253] of DWORD;
      i: Integer;
    begin
      for i := 1 to 254 do
      begin
        ip[i - 1] := i;
        CloseHandle(CreateThread(nil, 0, @f, @ip[i - 1], 0, dw[i - 1]));
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      InitializeCriticalSection(cs);
      SetLength(ip, 254);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      DeleteCriticalSection(cs);
    end;
      

  3.   

    可以
    procedure ThreadDo(P:Pstring);
    var
     ipadd:string;
    begin
     try
      if not assigned(p) then  exit;
      ipadd:=P^;
      if DevClearPassword(IpAdd) = true
       begin
         break;
       end
     finally
      Endthread(0);
     end;
    end;function myfunction:integer;
    var
     Pipadd:Pstring;
     i:integer;
     t:Cardinal;
    begin
     for i:= 1 to 254 do 
     begin
      new(Pipadd);
      Pipadd^:='192.168.1.' + inttostr(i);;
      result:=beginthread(nil,0,@ThreadDo,Pipadd,0,t);
     end;
    end;
      

  4.   


    我就是不知道连接的设备的IP啊,如果知道IP或知道IP的子集那就好办了,就是得到IP相当耗时间。。
    清除密码倒是不耗时。
      

  5.   

    楼主需要先确认一下DevClearPassword函数是否支持多线程操作, 即前次调用未结束时又被调用。