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.道理和这个一样
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. 这个
郁闷了~ 按照楼上那位兄弟说的,我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.
晕~~ 简洁点的代码如下: 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;
当你定时器开启以后是靠消息来驱动的,与for没关系地、
用Event := CreateEvent();然后在for循环里面当你激活定时器后加上WaitForSingleObject(Event,);在你的过程里面事情做完了disable定时器,然后setEvent(Event);
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.道理和这个一样
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.
这个
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.
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;
你让它怎么继续做下去呢?