我写了一个for 循环 ,循环体重要执行一个procedure  怎么才能让procedure 执行完了后继续执行循环呢?在未执行完procedure for循环不往下走…… ??

解决方案 »

  1.   

    在循环体内,如果代码没执行完事不会执行下次for循环地, 何情况?
      

  2.   

    我是写了一个for 循环,循环体重有一个定时器,定时器执行一个过程。 我遇到的一个情况是 我定时器执行的code 还未执行完,for 循环就继续执行了~ 晕,不知道为什么~  我想在想实现。执行一个for循环,循环体中。有一个定时器。定时器中执行一个过程,当过程执行完后定时器 disenable for循环继续执行~~~
      

  3.   

    晕,我还以为那过程在for循环里面,你这完全是2码事嘛。
    当你定时器开启以后是靠消息来驱动的,与for没关系地、
    用Event := CreateEvent();然后在for循环里面当你激活定时器后加上WaitForSingleObject(Event,);在你的过程里面事情做完了disable定时器,然后setEvent(Event);
      

  4.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Button1: TButton;
        Button2: TButton;
        Memo1: TMemo;
        Button3: TButton;
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        MyEvent : THandle;
        { Public declarations }
      end;
      TMyThread = class(TTHread)
      protected
        procedure Execute();Override;
      end;
    var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      self.Memo1.Lines.Add('Test');
      self.Timer1.Enabled := False;
      setEvent(MyEvent);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyEvent := windows.CreateEvent(nil,False,False,nil);
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      I : Integer;
    begin
      for I := 0 to  1000 do
      begin
        if I > 10 then Exit;
        self.Timer1.Enabled := True;
        sleep(0);
        Application.ProcessMessages;
        if windows.WaitForSingleObject(MyEvent,INFINITE) <> WAIT_FAILED then  end;
    end;
    procedure TMyThread.Execute();
    var
      I : Integer;
    begin
      for I := 0 to  1000 do
      begin
        if I > 10 then Exit;
        Form1.Timer1.Enabled := True;
        //sleep(0);
        //Application.ProcessMessages;
        if windows.WaitForSingleObject(Form1.MyEvent,INFINITE) <> WAIT_FAILED then  end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
      MyTest : TMyThread;
    begin
      MyTest := TMyThread.Create(False);end;end.道理和这个一样
      

  5.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Button1: TButton;
        Button2: TButton;
        Memo1: TMemo;
        Button3: TButton;
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        MyEvent : THandle;
        { Public declarations }
      end;
      TMyThread = class(TTHread)
      protected
        procedure Execute();Override;
      end;
    var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      self.Memo1.Lines.Add('Test');
      self.Timer1.Enabled := False;
      setEvent(MyEvent);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyEvent := windows.CreateEvent(nil,False,False,nil);
    end;procedure TMyThread.Execute();
    var
      I : Integer;
    begin
      for I := 0 to  1000 do
      begin
        if I > 10 then Exit;
        Form1.Timer1.Enabled := True;
        //sleep(0);
        //Application.ProcessMessages;
        if windows.WaitForSingleObject(Form1.MyEvent,INFINITE) <> WAIT_FAILED then  end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
      MyTest : TMyThread;
    begin
      MyTest := TMyThread.Create(False);end;end.
    这个
      

  6.   

    郁闷了~ 按照楼上那位兄弟说的,我code如下,但是存在问题。哪位兄弟帮我看看问题出在哪里~?
    unit scan;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, Grids, DBGrids, ExtCtrls, Buttons, Menus,WinSock,Math,
      ADODB, DB, WinSkinData,ShellAPI;type
      TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        GroupBox1: TGroupBox;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        TabSheet3: TTabSheet;
        TabSheet4: TTabSheet;
        Label1: TLabel;
        GroupBox2: TGroupBox;
        Memo1: TMemo;
        Edit1: TEdit;
        GroupBox3: TGroupBox;
        DBGrid1: TDBGrid;
        Label2: TLabel;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        GroupBox4: TGroupBox;
        GroupBox5: TGroupBox;
        BitBtn1: TBitBtn;
        ComboBox1: TComboBox;
        GroupBox6: TGroupBox;
        Label4: TLabel;
        Label5: TLabel;
        Edit2: TEdit;
        Edit3: TEdit;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        N3: TMenuItem;
        SaveDialog1: TSaveDialog;
        Label3: TLabel;
        Timer1: TTimer;
        ProgressBar1: TProgressBar;
        DBGrid2: TDBGrid;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        ping: TBitBtn;
        DataSource1: TDataSource;
        N4: TMenuItem;
        N5: TMenuItem;
        GroupBox7: TGroupBox;
        Memo2: TMemo;
        GroupBox8: TGroupBox;
        Label6: TLabel;
        Edit4: TEdit;
        Label7: TLabel;
        GroupBox9: TGroupBox;
        Label8: TLabel;
        Edit5: TEdit;
        Label9: TLabel;
        Edit6: TEdit;
        ComboBox2: TComboBox;
        BitBtn2: TBitBtn;
        procedure Button3Click(Sender: TObject);
        procedure pingClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure StatusBar1DrawPanel(StatusBar: TStatusBar;
          Panel: TStatusPanel; const Rect: TRect);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        MyEvent:THandle;
      end;
      TMyThread = class(TTHread)
      protected
        procedure Execute();override;
      end;
        PIPOptionInformation = ^TIPOptionInformation;
      TIPOptionInformation = packed record
         TTL:         Byte;      // Time To Live (used for traceroute)
         TOS:         Byte;      // Type Of Service (usually 0)
         Flags:       Byte;      // IP header flags (usually 0)
         OptionsSize: Byte;      // Size of options data (usually 0, max 40)
         OptionsData: PChar;     // Options data buffer
      end;
        PIcmpEchoReply = ^TIcmpEchoReply;
      TIcmpEchoReply = packed record
         Address:       DWord;                // replying address
         Status:        DWord;                // IP status value (see below)
         RTT:           DWord;                // Round Trip Time in milliseconds
         DataSize:      Word;                 // reply data size
         Reserved:      Word;
         Data:          Pointer;              // pointer to reply data buffer
         Options:       TIPOptionInformation; // reply options
      end;
      TIcmpCreateFile=function:THandle;stdcall;
      TIcmpCloseHandle=function(IcmpHandle:THandle):Boolean;stdcall;
      TIcmpSendEcho=function(
         IcmpHandle:          THandle;
         DestinationAddress:  DWord;
         RequestData:         Pointer;
         RequestSize:         Word;
         RequestOptions:      PIPOptionInformation;
         ReplyBuffer:         Pointer;
         ReplySize:           DWord;
         Timeout:             DWord
      ):DWORD;stdcall;
    var
      Form1: TForm1;
      auto_start:Integer;
      i:Integer;
    implementation{$R *.dfm}const
      icmpdll='icmp.dll';
    var
      hICMPlib:HMODULE;
      IcmpCreateFile:TIcmpCreateFile;
      IcmpCloseHandle:TIcmpCloseHandle;
      IcmpSendEcho:TIcmpSendEcho;
      hICMP:THandle;
      ping_num,ping_ok:Integer;
      ping_lv,ptime_min,ptime_max,ptime_avg:Integer;
      ping_state:Integer;
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      Close;
    end;procedure TForm1.pingClick(Sender: TObject);
    const
      outtime=2000;
    var
      address:DWORD;
      size:Integer;
      hostname,hostip:string;
      phe:PHostEnt;
      BufferSize,nPkts:Integer;
      pReqData, pData:Pointer;
      pIPE:PIcmpEchoReply;
      IPOpt:TIPOptionInformation;
      ss,s2:string;
      p,x,y,nt,k,kk:integer;
      TheRect:TRect;
    begin
      ping_state:=1;
      address:=inet_addr(PChar(ADOQuery1.Fields[ADOQuery1.FieldCount-1].AsString));
      hostip:=StrPas(inet_ntoa(TInAddr(Address)));
      hostname:=hostip;
      size:=SizeOf(Edit2.Text);
      ss:=IntToStr(ping_num)+' ';
      p:=0;
      BufferSize:=SizeOf(TIcmpEchoReply) + size;
      GetMem(pReqData,size);
      GetMem(pData,size);
      GetMem(pIPE,BufferSize);
      FillChar(pReqData^,size,$AA);
      pIPE.Data:=pData;
      FillChar(IPOpt,SizeOf(IPOpt),0);
      IPOpt.TTL:=64;
      nPkts:=IcmpSendEcho(hICMP,address,pReqData,size,@IPOpt,pIPE,BufferSize,outtime);
      if nPkts=0 then
      begin
        Memo1.Lines.Add(ss+' Request timed out.');
      end
      else
      begin
        hostip:=StrPas(inet_ntoa(TInAddr(pIPE^.Address)));
        if (pIPE^.DataSize>0) then
        begin
          p:=1;
          nt:=pipe^.RTT;
          Memo1.Lines.Add(ss + ' Request '+ IntToStr(pipe^.DataSize)+' bytes from  '+ hostip+' in '+ IntToStr(nt)+ ' msecs');
          if ptime_min>nt then ptime_min:=nt;
          if ptime_max<nt then ptime_max:=nt;
        end
        else
          Memo1.Lines.Add(ss+' Request timed out.');
      end;
      FreeMem(pIPE);
      FreeMem(pData);
      FreeMem(pReqData);
      if p>0 then
      begin
        ping_ok:=ping_ok+1;
      end;  ping_lv:=ceil(ping_ok/ping_num*100);
      if ping_lv <60 then
      Label3.Font.Color:=clRed
      else
      Label3.Font.Color:=clBlue;
      s2:='发测试包:'+ IntToStr(ping_num)+ ' 成功返回包:'+ IntToStr(ping_ok);
      if ping_ok > 0 then
      ptime_avg:=Ceil((ptime_avg*(ping_ok-1)+nt)/ping_ok);
      s2:=s2+' 接通率:'+inttostr(ping_lv)+'% ';
      s2:=s2+' 时延:min='+inttostr(ptime_min)+'/max='+inttostr(ptime_max)+'/avg='+inttostr(ptime_avg);
      Label3.Caption:=s2;
      ping_state:=0;
    end;procedure TForm1.FormShow(Sender: TObject);
    var
      wsadata:TWSAData;
    begin
      if WSAStartup($101,wsadata)<>0 then
      begin
       ShowMessage('Error initialising Winsock');
       Halt
      end;
      hICMPlib:=LoadLibrary(icmpdll);
      @IcmpCreateFile:=GetProcAddress(hICMPlib,'IcmpCreateFile');
      @IcmpCloseHandle:=GetProcAddress(hICMPlib,'IcmpCloseHandle');
      @IcmpSendEcho:=GetProcAddress(hICMPlib,'IcmpSendEcho');
      if (@IcmpCreateFile=nil) or (@IcmpCloseHandle=nil) or (@IcmpSendEcho=nil) then
      begin
        ShowMessage('Error loading dll functions');
        Halt;
      end;
      hICMP:=IcmpCreateFile;
      if hICMP=INVALID_HANDLE_VALUE then
      begin
        ShowMessage('Unable to get ping handle');
        Halt;
      end;
      ping_ok:=0;
      ping_num:=0;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      IcmpCloseHandle(hICMP);
      FreeLibrary(hICMPlib);
      if WSACleanup <> 0 then
      ShowMessage('Error freeing winsock');
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    var
      icount:Integer;
    begin
      icount:=StrToInt(Edit3.Text);  if (ping_num<icount) or (icount=0) then
      begin
        if ping_state=0 then
        begin
          StatusBar1.Panels[0].Text:='正在检测...';
          ping_num:=ping_num+1;
          ProgressBar1.Position:=ping_num;
          ping.Click;
        end;
      end
      else
      begin
        Timer1.Enabled:=False;
        Button3.Enabled:=True;
        Button4.Enabled:=True;
        Edit2.ReadOnly:=False;
        Edit3.ReadOnly:=False;
        ProgressBar1.Position:=0;
        StatusBar1.Panels[0].Text:='状态:';
        SetEvent(MyEvent);
      end;
    end;
    procedure TMyThread.Execute;
    begin
      Form1.ADOQuery1.Open;
      Form1.ADOQuery1.First;
      Form1.Timer1.Interval:=1
      while not form1.ADOQuery1.Eof do
        begin
        Form1.Edit1.Text:='';
        for i:=0 to Form1.ADOQuery1.FieldCount-1 do
        begin
          Form1.Edit1.Text:=Form1.Edit1.Text+ ' ->'+form1.ADOQuery1.Fields[i].AsString;
        end;
        if windows.WaitForSingleObject(Form1.MyEvent,INFINITE) <> WAIT_FAILED then
        ShowMessage('ok');
        Form1.ADOQuery1.next;
        end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
       mytest:TMyThread;
    begin
      ping_num:=0;
      ping_ok:=0;
      ping_lv:=0;
      ping_state:=0;
      ptime_min:=99999;
      ptime_max:=0;
      ptime_avg:=0;
      Memo1.Lines.Clear;
      Timer1.Enabled:=True;
      Edit2.ReadOnly:=True;
      edit3.ReadOnly:=True;
      Button3.Enabled:=False;
      Button4.Enabled:=False;
      Form1.Update;
      ProgressBar1.Position:=0;
      ProgressBar1.Max:=StrToInt(Edit3.Text);
      try
        MyEvent:=Windows.CreateEvent(nil,False,False,nil);
      finally
         mytest:=TMyThread.Create(False);
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Timer1.Enabled:=False;
      Button3.Enabled:=True;
      Button4.Enabled:=True;
      Edit2.ReadOnly:=False;
      Edit3.ReadOnly:=False;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      press:Integer;begin
      StatusBar1.Panels[1].Style:=psOwnerDraw;
      ProgressBar1.Parent:=StatusBar1;
      press:=GetWindowLong(ProgressBar1.Handle,GWL_EXSTYLE);
      press:=press-WS_EX_STATICEDGE;
      SetWindowLong(ProgressBar1.Handle,GWL_EXSTYLE,press);
      //try  //finally  //end;end;procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
    begin
      if Panel=StatusBar1.Panels[1] then
      with ProgressBar1 do
      begin
        top:=Rect.Top;
        left:=Rect.Left;
        Width:=Rect.Right- Rect.Left-15;
        Height:=Rect.Bottom- Rect.Top;
      end;end;procedure TForm1.Button4Click(Sender: TObject);
    begin
      ShellExecute(Handle,nil,PChar('https://'+ ADOQuery1.Fields[ADOQuery1.FieldCount-1].AsString),nil,nil,SW_SHOWNORMAL);
    end;end.
      

  7.   

    晕~~ 简洁点的代码如下:
    unit scan;interfaceuses
    ……type……  public
        { Public declarations }
        MyEvent:THandle;
      end;
      TMyThread = class(TTHread)
      protected
        procedure Execute();override;
      end;
    var
      Form1: TForm1;
      auto_start:Integer;
      i:Integer;
    implementation{$R *.dfm}……
    procedure TForm1.pingClick(Sender: TObject);
    const
      outtime=2000;
    var
    ……
    begin
     ……
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    var
      icount:Integer;
    begin
      icount:=StrToInt(Edit3.Text);  if (ping_num<icount) or (icount=0) then
      begin
        if ping_state=0 then
        begin
          StatusBar1.Panels[0].Text:='正在检测...';
          ping_num:=ping_num+1;
          ProgressBar1.Position:=ping_num;
          ping.Click;
        end;
      end
      else
      begin
        Timer1.Enabled:=False;
        ProgressBar1.Position:=0;
        StatusBar1.Panels[0].Text:='状态:';
        SetEvent(MyEvent);
      end;
    end;
    procedure TMyThread.Execute;
    begin
      Form1.ADOQuery1.Open;
      Form1.ADOQuery1.First;
      Form1.Timer1.Interval:=1
      while not form1.ADOQuery1.Eof do
        begin
        Form1.Edit1.Text:='';
        for i:=0 to Form1.ADOQuery1.FieldCount-1 do
        begin
          Form1.Edit1.Text:=Form1.Edit1.Text+ ' ->'+form1.ADOQuery1.Fields[i].AsString;
        end;
        if windows.WaitForSingleObject(Form1.MyEvent,INFINITE) <> WAIT_FAILED then
        ShowMessage('ok');
        Form1.ADOQuery1.next;
        end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
       mytest:TMyThread;
    begin
      Form1.Update;
      ProgressBar1.Position:=0;
      ProgressBar1.Max:=StrToInt(Edit3.Text);
      try
        MyEvent:=Windows.CreateEvent(nil,False,False,nil);
      finally
         mytest:=TMyThread.Create(False);
      end;……
    end;
      

  8.   

    你的Timer1.Enabled:=False;关闭以后,没开启啊。Timer1.Enabled:=True;
    你让它怎么继续做下去呢?