中文版 | English

网站首页 | 个人作品 | 博客 | 给我留言 | 经典分享 | 友情链接 | 黑白人生


多线程扫描代码delphi

unit Unit1;    
   
interface    
   
uses    
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,    
  Dialogs, ComCtrls, StdCtrls, XPMan, ExtCtrls, ActnMan, ActnColorMaps,    
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,unit2;    
   
type    
  TForm1 = class(TForm)    
    Panel1: TPanel;    
    Edit1: TEdit;    
    Label1: TLabel;    
    XPManifest1: TXPManifest;    
    Button1: TButton;    
    PageControl1: TPageControl;    
    TabSheet1: TTabSheet;    
    TabSheet2: TTabSheet;    
    RadioGroup1: TRadioGroup;    
    Memo1: TMemo;    
    RadioGroup2: TRadioGroup;    
    Memo2: TMemo;    
    Panel2: TPanel;    
    Memo3: TMemo;    
    Edit2: TEdit;    
    Button2: TButton;    
    Button3: TButton;    
    Button4: TButton;    
    IdHTTP1: TIdHTTP;    
    ProgressBar1: TProgressBar;    
    StatusBar1: TStatusBar;    
    OpenDialog1: TOpenDialog;    
    SaveDialog1: TSaveDialog;    
    Button5: TButton;    
    procedure Button2Click(Sender: TObject);    
    procedure Button1Click(Sender: TObject);    
    procedure Button4Click(Sender: TObject);    
    procedure Button5Click(Sender: TObject);    
  private   
    { Private declarations }    
    procedure ThreadExit(sender: TObject);    
  public   
    { Public declarations }    
  end;    
   
var    
  Form1: TForm1;    
  Thread1:array of ScanThread;    
  n:integer=0;    
  bool:boolean=true;    
implementation    
   
{$R *.dfm}    
   
procedure TForm1.Button2Click(Sender: TObject);    
begin    
  if trim(edit2.Text)<>'' then    
    Memo3.Lines.Add(trim(edit2.Text));     
end;    
   
procedure TForm1.Button1Click(Sender: TObject);    
var    
  i: integer;    
  Sum:integer;    
begin    
  if edit1.Text='' then    
  begin    
  messagebox(handle,'URL不能为空','提示',MB_OK);    
  exit;    
  end    
  else   
  if bool then    
  begin    
    Memo1.Clear;    
    Memo2.Clear;    
    n :=0;    
    Sum :=Memo3.lines.count;    
    SetLength(Thread1,Sum);   // 动态设置线程的数量    
    ProgressBar1.Min :=0;    
    ProgressBar1.Max :=sum;    
    ProgressBar1.Step :=1;    
    ProgressBar1.Position :=0;    
    for i := 0 to Sum - 1 do   
    begin    
      Thread1[i] := scanthread.Create(Memo3,Memo2,Memo1,i);    
      Thread1[i].OnTerminate := ThreadExit;    
    end;    
  end;    
  bool := False;    
end;    
  procedure TForm1.ThreadExit(sender: TObject);    
begin    
  ProgressBar1.StepIt;    
  Memo1.Lines.Add(trim(Edit1.Text)+Memo3.Lines[n]);    
  inc(n);    
  if N = Memo3.lines.count then    
  begin    
    bool := true;    
    exit;    
  end;    
end;    
procedure TForm1.Button4Click(Sender: TObject);    
begin    
  if opendialog1.Execute then    
  begin    
  Memo3.Lines.LoadFromFile(Opendialog1.FileName);    
  end;    
end;    
   
procedure TForm1.Button5Click(Sender: TObject);    
begin    
  if savedialog1.Execute then    
    Memo2.Lines.SaveToFile(savedialog1.FileName);    
end;    
   
end.    
   
unit Unit2;    
   
interface    
   
uses    
  Classes,StdCtrls,Windows,SysUtils,wininet,IdHTTP;    
var    
  CS:TRTLCriticalSection;    //定义全局临界区    
type    
  ScanThread = class(TThread)    
  private   
    { Private declarations }    
    TM1,TM2,Tm3:TMemo;    
    TMNum:Integer;    
    str:string;    
  protected   
    procedure Execute; override;    
    procedure datamemo;    
  public   
    constructor Create(M1,M2,M3:TMemo;num:integer);    
  end;    
function  CheckUrl(url: string; TimeOut: integer = 5000): boolean;    
function  Get(Url:string):boolean;    
implementation    
   
{ Important: Methods and properties of objects in visual components can only be    
  used in a method called using Synchronize, for example,    
   
      Synchronize(UpdateCaption);    
   
  and UpdateCaption could look like,    
   
    procedure ScanThread.UpdateCaption;    
    begin    
      Form1.Caption := 'Updated in a thread';    
    end; }    
   
{ ScanThread }    
uses unit1;    
constructor ScanThread.Create(M1,M2,M3:TMemo;Num:integer);    
begin    
  TM1:=M1;    
  TM2:=M2;    
  TM3:=M3;    
  TMNum:=Num;    
  FreeonTerminate:=True;       //直接删除线程    
  InitializeCriticalSection(CS); //初始化临界区    
  inherited Create(False); // 直接运行    
end;    
function get(Url:string):boolean;    
var    
  IdHttp:TIdHttp;    
  URLData:String;    
begin    
  Result:=false;    
  IdHttp:=Tidhttp.Create(nil);    
  try   
    try   
      IdHttp.HandleRedirects:=True; //支持重定向    
      IdHttp.ReadTimeout:=30000;    //访问延时,超过这个时间便不再访问    
      UrlData:=IdHttp.Get(URL);    
      if Idhttp.ResponseCode=200 then    
      Result:=True;    
    except    
      end;    
  finally    
    Idhttp.Free;    
  end;    
end;    
function CheckUrl(url: string; TimeOut: integer = 5000): boolean;    
var    
  hSession, hfile, hRequest: hInternet;    
  dwindex, dwcodelen: dword;    
  dwcode: array[1..20] of char;    
  res: pchar;    
  re: integer;    
  Err1: integer;    
  j: integer;    
begin    
  if pos('http://', lowercase(url)) = 0 then    
    url := 'http://'+url; 
  Result := false;    
  InternetSetOption(hSession, Internet_OPTION_CONNECT_TIMEOUT, @TimeOut, 4);    
  hSession := InternetOpen('Mozilla/4.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); //创建intenet连接会话对象    
   //设置超时    
  if assigned(hsession) then  //判断hsession是否为nil,为nil返回false    
  begin    
    j := 1;    
    while true do   
    begin    
      hfile := InternetOpenUrl(hsession, pchar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);//建立intenet连接    
   if hfile = nil then    
      begin    
        j := j + 1;    
        Err1 := GetLastError;    
        if j > 5 then break;    
        if (Err1 <> 12002) or (Err1 <> 12152) then break;    
        sleep(2);    
      end    
      else begin    
        break;    
      end;    
    end;    
    dwIndex := 0;    
    dwCodeLen := 10;    
    HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex);    
    res := pchar(@dwcode);    
    re := strtointdef(res, 404);    
    case re of    
      400..450: result := false;    
    else result := true;    
    end;    
    if assigned(hfile) then    
      InternetCloseHandle(hfile);    
      InternetCloseHandle(hsession);    
    end;    
end;    
function GetBackSpaceCount(str:string):string;    
var i,iCount:integer;    
begin    
   iCount :=50-length(str);    
   for i:=0 to iCount-1 do   
   begin    
     Result :=Result+' ';    
   end;    
end;    
   
procedure scanthread.datamemo;    
begin    
  TM2.Lines.Add(str+GetBackSpaceCount(str)+'存在');    
  Form1.Radiogroup2.Caption :='存在:共找到'+inttostr(TM2.Lines.Count)+'条路径';    
end;    
procedure ScanThread.Execute;    
begin    
  { Place thread code here }    
  Str :=trim(Form1.Edit1.Text) + TM1.Lines[TmNum];    
  EnterCriticalSection(cs);         //进入临界区    
  if CheckUrl(Str) then    
  begin    
    Synchronize(DataMemo); // 同步    
  end;    
  LeaveCriticalSection(CS);      //退出临界区    
end;    
   
end.

上一篇: 为死者哀悼,为伤者祈祷!众志成城,共度难关!
下一篇: 这么早就有人对我站开展垃圾注入了