pings:array  of  pingip;//动态线程数组,想创建随意多的线程  
 
setlength(pings,6);  
for  i:=0  to  5  do  begin  
pings[i]:=pingip.Create();//ping线程检测电脑是否在线  
end  
 
-------------问赐教题:  
启动线程没有问题,但线程运行时,主窗口都不能拖动,等线程运行结果出来时,才能动的,这是什么原因?照理应该不影响主线程的呀?

解决方案 »

  1.   

    unit Unit2;interfaceuses
      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好像有问题
      

  2.   


    procedure pingip.Execute;
    begin
      Synchronize(checkip); //??????????????
    end;你自己把所有代码都在主线程中执行啊.肯定要等线程执行完成才会有响应啊.
      

  3.   

    procedure pingip.Execute;
    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;
      

  4.   

    原来是这样 我试一试 线程ping一个ip如何在让它继续进行下去?仍执行execute好像有问题
      

  5.   

    上面的方法中,要把IP定义为PingIP中的私有私量.
      

  6.   

    试过了,没多大变化
    关键iplist也是主线程的
    在主线程运行的只有form1.log.Text:=form1.log.Text+ip+':在线'+#13+#10吗?
      

  7.   

    unit Unit1;interfaceuses
      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