pings:array of pingip;//动态线程数组,想创建随意多的线程
setlength(pings,6);
for i:=0 to 5 do begin
pings[i]:=pingip.Create();//ping线程检测电脑是否在线
end
-------------问赐教题:
启动线程没有问题,但线程运行时,主窗口都不能拖动,等线程运行结果出来时,才能动的,这是什么原因?照理应该不影响主线程的呀?
setlength(pings,6);
for i:=0 to 5 do begin
pings[i]:=pingip.Create();//ping线程检测电脑是否在线
end
-------------问赐教题:
启动线程没有问题,但线程运行时,主窗口都不能拖动,等线程运行结果出来时,才能动的,这是什么原因?照理应该不影响主线程的呀?
Classes,ping,forms,dialogs; type
pingip = class(TThread)
private
objping:tping;
procedure checkip();
procedure ThreadDone(Sender:TObject);
protected
procedure Execute; override;
public
constructor create();//virtual;
destructor Destroy; override;
end;implementation
uses unit1;
procedure pingip.Execute;
begin
Synchronize(checkip);
end;procedure pingip.ThreadDone(Sender: TObject); //注意事件发送者sender是线程
begin
form1.log.Text:=form1.log.Text+'su'+#13+#10;
//execute;
end;procedure pingip.checkip();
var ip:string;
begin
if iplist.Count>0 then begin
ip:=iplist[0];
iplist.Delete(0);
objping.address:=ip;
objping.ping;
if objping.ErrorCode=0 then
form1.log.Text:=form1.log.Text+ip+':在线'+#13+#10
else
form1.log.Text:=form1.log.Text+ip+':不在线或者屏蔽了'+#13+#10;
end;
end;constructor pingip.create();
begin
objping:=tping.create(nil);
FreeOnTerminate:=false;
OnTerminate:=ThreadDone;
inherited create(false);
end;还有个小问题:线程ping一个ip如何在让它继续进行下去?仍执行execute好像有问题
procedure pingip.Execute;
begin
Synchronize(checkip); //??????????????
end;你自己把所有代码都在主线程中执行啊.肯定要等线程执行完成才会有响应啊.
var ip:string;
begin
if iplist.Count>0 then begin
ip:=iplist[0];
iplist.Delete(0);
objping.address:=ip;
objping.ping;
if objping.ErrorCode=0 then
Synchronize(SS_IN)
else
Synchronize(SS_OUT);
end;
end;procedure pingip.SS_IN;
begin
form1.log.Text:=form1.log.Text+ip+':在线'+#13+#10
end;procedure pingip.SS_OUT;
begin
form1.log.Text:=form1.log.Text+ip+':不在线或者屏蔽了'+#13+#10;end;
关键iplist也是主线程的
在主线程运行的只有form1.log.Text:=form1.log.Text+ip+':在线'+#13+#10吗?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Ping;type
TForm1 = class(TForm)
Ping1: TPing;
LOG: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
pingip = class(TThread)
private
ip:string;
objping:tping;
procedure checkip();
procedure PRINTip();
procedure ThreadDone(Sender:TObject); protected
procedure Execute; override;
public
constructor create();//virtual;
destructor Destroy; override;
end;var
Form1: TForm1;
iplist:TSTRINGLIST;implementation{$R *.dfm}procedure pingip.Execute;
begin
checkip;
end;procedure pingip.ThreadDone(Sender: TObject); //注意事件发送者sender是线程
begin
PRINTIP;
//execute;
end;procedure pingip.checkip();beginIF IP<>'' THEN
BEGIN
objping.address:=ip;
objping.ping;
END;
end;constructor pingip.create();
begin
if iplist.Count>0 then
begin
ip:=iplist[0];
iplist.Delete(0);
objping:=tping.create(nil);
END ;
inherited create(false);
FreeOnTerminate:=TRUE;
OnTerminate:=ThreadDone;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
IPLIST:=TSTRINGLIST.Create ;
IPLIST.LoadFromFile('C:\IP.TXT');
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
IPLIST.Free ;
end;procedure TForm1.Button1Click(Sender: TObject);
VAR
pings:array of pingip;//动态线程数组,想创建随意多的线程
I:INTEGER;
beginsetlength(pings,6);
for i:=0 to 5 do begin
pings[i]:=pingip.Create();//ping线程检测电脑是否在线
endend;procedure pingip.PRINTip;
begin
IF IP<>'' THEN
if objping.ErrorCode=0 then
form1.log.Text:=form1.log.Text+ip+':在线'+#13+#10
else
form1.log.Text:=form1.log.Text+ip+':不在线或者屏蔽了'+#13+#10;
end;destructor pingip.Destroy;
begin
IF IP<>'' THEN
objping.Free ;
inherited;
end;end.//C:IP.TXT 文件内容
//10.2.1.254
//10.2.88.248
//10.2.188.1
//10.2.11.1
//10.2.111.1
//10.2.1.254
//10.2.88.248
//10.2.188.1
//10.2.11.1
//10.2.111.1
//10.2.1.254
//10.2.88.248
//10.2.188.1
//10.2.11.1
//10.2.111.1
//10.2.1.254
//10.2.88.248
//10.2.188.1
//10.2.11.1
//10.2.111.1
//10.2.1.254
//10.2.88.248
//10.2.188.1
//10.2.11.1
//10.2.111.1