Подскажите пожалуйста почему не работают потоки? При нажатии на кнопку как-будто ничего не происходит.
| Код | TNewThread = class(TThread) private IPaddr : string; IPport : string; Rez : integer; protected procedure Execute; override; public procedure Sync; // constructor Create(CreateSuspended: Boolean); end;
var Form2 : TForm2; TA : integer; Thread,Acc : integer; Work:boolean; CS:TcriticalSection; startIP,konIP,rezIP:integer; ip:string; implementation
{$R *.dfm} uses Unit1;
//Функция сканирования function scan(ip:string;port,tm:integer):boolean; var sock:TSocket; timeout:TTimeVal; addr:sockaddr_in; fds:TFDSet; block:u_long; begin Result:=false; sock:=socket(AF_INET, SOCK_STREAM, 0); if sock=INVALID_SOCKET then exit; addr.sin_family:=AF_INET; addr.sin_addr.S_addr:=inet_addr(pchar(ip)); addr.sin_port:=htons(port); block:=1; if ioctlsocket(sock, FIONBIO, block)<>0 then begin closesocket(sock); exit; end; if connect(sock,@addr,sizeof(addr))=0 then begin Result:=true; closesocket(sock); exit; end; if WSAGetLastError=WSAEWOULDBLOCK then begin FD_ZERO(fds); FD_SET(sock,fds); timeout.tv_sec:=tm; timeout.tv_usec:=0; end else begin closesocket(sock); exit; end; if select(0, nil, @fds, nil, @timeout)=1 then Result:=true; closesocket(sock); end;
procedure TForm2.Button1Click(Sender: TObject);
begin begin //Вычисление количества ip для сканирования startIP:=( (strtoint(Edit7.Text)*256*256*256)+(strtoint(Edit5.Text)*256*256)+(strtoint(Edit3.Text)*256)+(strtoint(Edit1.Text))); konIP:=( (strtoint(Edit8.Text)*256*256*256)+(strtoint(Edit6.Text)*256*256)+(strtoint(Edit4.Text)*256)+(strtoint(Edit2.Text))); rezIP:=konIP-startIP; end; Acc:=-1; // Создание потоков TA:=StrToInt(Edit10.Text); for Thread:=1 to StrToINt(Edit11.Text) do TNewThread.Create(false); Thread:=StrToInt(Edit11.Text); end;
procedure TNewThread.Execute; var i,j,h,c : integer; CurAcc : integer;
begin while Work do CS.Enter; Inc(Acc); if Acc<rezIP then CurAcc:=Acc else Work:=false; CS.Leave; if Work then if ((Form2.Edit1.Text='') or (Form2.Edit2.Text='') or (Form2.Edit3.Text='') or (Form2.Edit4.Text='') or (Form2.Edit5.Text='') or (Form2.Edit6.Text='') or (Form2.Edit7.Text='') or (Form2.Edit8.Text='')) then begin showmessage('Есть не заполненные поля!'); exit; end;
for h:=StrToInt(Form2.Edit7.Text) to StrToInt(Form2.Edit8.Text) do for c:=StrToInt(Form2.Edit5.Text) to StrToInt(Form2.Edit6.Text) do for j:=StrToInt(Form2.Edit3.Text) to StrToInt(Form2.Edit4.Text) do for i:=StrToInt(Form2.Edit1.Text) to StrToInt(Form2.Edit2.Text) do begin
ip:=(IntToStr(h)+'.'+IntToStr(c)+'.'+IntToStr(j)+'.'+IntToStr(i)); Form2.StatusBar1.Panels[0].Text:=ip; Form2.StatusBar1.Panels[1].Text:=inttostr(Acc)+'/'+inttostr(rezIP); try scan(ip,strtoint(Form2.Edit9.Text),1); //<> true then Form2.Memo1.Lines.Add(ip+':'+Form2.Edit9.Text) Rez:=-1; except if scan(ip,strtoint(Form2.Edit9.Text),1) = true then Rez:=1 else Rez:=0 end; Synchronize(Sync); end; end;
procedure TNewThread.Sync; begin case Rez of 0:begin Form2.Memo2.Lines.Add('Error!'); end; 1:begin Form2.Memo1.Lines.Add(ip+':'+Form2.Edit9.Text); end; -1:begin Form2.Memo2.Lines.Add(ip+':'+Form2.Edit9.Text); end; end; end;
procedure TForm2.Button2Click(Sender: TObject); begin Form2.Memo1.Clear; Form2.Memo2.Clear; end;
procedure TForm2.Button3Click(Sender: TObject); begin Form1.Memo1.Lines:=Form2.Memo1.Lines; end;
end.
|
|