Не рабатают потоки

 
0
 
Delphi, Kylix & Pascal
ava
DeSx86 | 17.03.2013, 18:56
Подскажите пожалуйста почему не работают потоки? При нажатии на кнопку как-будто ничего не происходит.

  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.
Kommentare (1)
ava
Illusion Dolphin | 17.03.2013, 21:43 #
1) Настоятельно рекомендую http://forum.vingrad.ru/forum/topic-60076.html хотя бы прочитать
2) Всё отформатировать. Ещё более настоятельно рекомендую http://www.gunsmoker.ru/2011/01/blog-post.html
3) Вроде как надо основы отладки http://www.gunsmoker.ru/2012/02/5.html или гуглить
4) Я просмотрел наза 4 ничего не понял, но потоки должны стартавать, правда работать если будет, то с глюками, читать #1
5) Если что-то не работает - скажите, что именно, это познаётся через #3
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden