这样子的线程如何实现?

haochin 2010-02-28 11:25:52
我有一台设备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


多线程要怎么做?

...全文
120 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2010-03-01
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~~~~~~
s11ss 2010-02-28
  • 打赏
  • 举报
回复
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;
曼尼叔叔 2010-02-28
  • 打赏
  • 举报
回复
我觉得用线程做,也是一样的费时间,而且还绕了个弯。
你的IP是在192.168.1.2至192.168.1.254之间,不可能每一个IP都有连设备吧?
那就先把连接有设备的IP找出来(这个应该能容易点吧),得到一个子集,
然后再用你的方法遍历这个子集
haochin 2010-02-28
  • 打赏
  • 举报
回复
引用 6 楼 jadeluo 的回复:
楼主需要先确认一下DevClearPassword函数是否支持多线程操作, 即前次调用未结束时又被调用。


这个是要先确认的。。但是还不知道要怎么确认呢。。
静远 2010-02-28
  • 打赏
  • 举报
回复
关注~学习~
回复内容太短~
jadeluo 2010-02-28
  • 打赏
  • 举报
回复
楼主需要先确认一下DevClearPassword函数是否支持多线程操作, 即前次调用未结束时又被调用。
haitao 2010-02-28
  • 打赏
  • 举报
回复
多线程找ip
干活,单线程
haochin 2010-02-28
  • 打赏
  • 举报
回复
引用 1 楼 gch_519 的回复:
我觉得用线程做,也是一样的费时间,而且还绕了个弯。
你的IP是在192.168.1.2至192.168.1.254之间,不可能每一个IP都有连设备吧?
那就先把连接有设备的IP找出来(这个应该能容易点吧),得到一个子集,
然后再用你的方法遍历这个子集


我就是不知道连接的设备的IP啊,如果知道IP或知道IP的子集那就好办了,就是得到IP相当耗时间。。
清除密码倒是不耗时。
IDWB 2010-02-28
  • 打赏
  • 举报
回复
可以
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;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧