Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как правильнее составить цикл?


Страницы:   1 2 3 4

linuxoid ©   (2010-07-26 08:26:00) 

Здравствуйте!

Имеется код программы(параллельный поток), которая пингует хост. теперь нужно сделать так, чтобы адреса хостов она вытаскивала из базы. как теперь это организовать в цикле?

unit thrd;

interface

uses
 Windows,  SysUtils,  Classes,
 StdCtrls, winsock;

type
 TThreadScan = class(TThread)
 private
 msg,msg2: string;
 procedure addstr;
   { Private declarations }
 protected
   procedure Execute; override;
 end;

 type
   ip_option_information = packed record  // Информация заголовка IP (Наполнение
       // этой структуры и формат полей описан в RFC791.
       Ttl : byte;   // Время жизни (используется traceroute-ом)
       Tos : byte;   // Тип обслуживания, обычно 0
       Flags : byte;  // Флаги заголовка IP, обычно 0
       OptionsSize : byte;  // Размер данных в заголовке, обычно 0, максимум 40
       OptionsData : Pointer; // Указатель на данные
   end;

  icmp_echo_reply = packed record
       Address : u_long;        // Адрес отвечающего
       Status : u_long;       // IP_STATUS (см. ниже)
       RTTime : u_long;       // Время между эхо-запросом и эхо-ответом
            // в миллисекундах
       DataSize : u_short;        // Размер возвращенных данных
       Reserved : u_short;        // Зарезервировано
       Data : Pointer;    // Указатель на возвращенные данные
       Options : ip_option_information; // Информация из заголовка IP
   end;

   PIPINFO = ^ip_option_information;
   PVOID = Pointer;

       function IcmpCreateFile() : THandle; stdcall; external 'ICMP.DLL' name 'IcmpCreateFile';
       function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external 'ICMP.DLL'  name 'IcmpCloseHandle';
       function IcmpSendEcho(
                         IcmpHandle : THandle;    // handle, возвращенный IcmpCreateFile()
                         DestAddress : u_long;    // Адрес получателя (в сетевом порядке)
                         RequestData : PVOID;     // Указатель на посылаемые данные
                         RequestSize : Word;      // Размер посылаемых данных
                         RequestOptns : PIPINFO;  // Указатель на посылаемую структуру
                                           // ip_option_information (может быть nil)
                         ReplyBuffer : PVOID;     // Указатель на буфер, содержащий ответы.
                         ReplySize : DWORD;       // Размер буфера ответов
                         Timeout : DWORD          // Время ожидания ответа в миллисекундах
                        ) : DWORD; stdcall; external 'ICMP.DLL' name 'IcmpSendEcho';

implementation

uses Unit1;

procedure TThreadScan.addstr;
begin
Form1.ListBox1.Items.Add(msg);
end;

procedure TThreadScan.Execute;
var
  hIP : THandle;
   pingBuffer : array [0..31] of Char;
   pIpe : ^icmp_echo_reply;
   pHostEn : PHostEnt;
   wVersionRequested : WORD;
   lwsaData : WSAData;
   error : DWORD;
   destAddress : In_Addr;
   i, count:integer;
   //adress : array [1..30] of pansichar;
   IPReply: string;
begin
  // Создаем handle
   hIP := IcmpCreateFile();

   GetMem( pIpe,
           sizeof(icmp_echo_reply) + sizeof(pingBuffer));
   pIpe.Data := @pingBuffer;
   pIpe.DataSize := sizeof(pingBuffer);

   wVersionRequested := MakeWord(1,1);
   error := WSAStartup(wVersionRequested,lwsaData);

  // начало цикла
pHostEn := gethostbyname(adress[i]);
    destAddress := PInAddr(pHostEn^.h_addr_list^)^;

   IcmpSendEcho(hIP,
                destAddress.S_addr,
                @pingBuffer,
                sizeof(pingBuffer),
                Nil,
                pIpe,
                sizeof(icmp_echo_reply) + sizeof(pingBuffer),
                100);

   error := GetLastError();
   if (error <> 0) then
   begin

        msg:=(adress[i]+'  N/A');
      synchronize(addstr);
        //continue;
   end else begin

   msg:=(adress[i]+'  Reply time: '+IntToStr(pIpe.RTTime)+' ms');
   synchronize(addstr);
   end;

//конец цикла
   IcmpCloseHandle(hIP);
   WSACleanup();
   FreeMem(pIpe);

end;

end.


Anatoly Podgoretsky   (2010-07-26 12:51:00) [41]

> linuxoid  (26.07.2010 12:27:17)  [17]

Теперь все это в цикле


brother   (2010-07-26 12:49:00) [42]

я бы в конструкторе, добавил еще один параметр...


linuxoid   (2010-07-26 12:48:00) [43]


> и где описано: adress?
> как оно попадет в поток?


вот с этим мне надо разобраться


linuxoid   (2010-07-26 12:46:00) [44]


> где в коде вызов пинга вообще?


вызываю поток.
new1.resume;


brother   (2010-07-26 12:41:00) [45]

я еще раз тебе советую: раз ты в начинающих - используй мой код на таймере сделаный...


brother   (2010-07-26 12:40:00) [46]

а понял.
и где описано: adress?
как оно попадет в поток?


brother   (2010-07-26 12:38:00) [47]

где в коде вызов пинга вообще?


linuxoid   (2010-07-26 12:28:00) [48]

в этом случае он пингует только один хост.


linuxoid   (2010-07-26 12:27:00) [49]

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
adress:=form1.table.Fields.FieldByName('nodeip').AsString;
form1.table.Next;
end;
new1.resume;
end;


Anatoly Podgoretsky   (2010-07-26 12:17:00) [50]

> linuxoid  (26.07.2010 12:05:13)  [13]

Не льсти себе, тебе еще до новичка далеко.


Anatoly Podgoretsky   (2010-07-26 12:16:00) [51]

> linuxoid  (26.07.2010 12:10:14)  [14]

Непонятно, что такое adress[i] и зачем оно нужно. Что тут делает PChar,
зачем данные в цикле пишутся в adress[1] - это конечно не ошибка, это просто
абсурд. Где здесь поток, куда он пропал?


linuxoid   (2010-07-26 12:10:00) [52]


> А с этим циклом и не надо, ведь уже есть правильный цикл
> while not form1.table.Eof do begin


begin
form1.table.Open;
form1.table.First;
i:=1;
while not form1.table.Eof do begin
adress[i]:=pchar(form1.table.Fields.FieldByName('nodeip').AsString);
listbox1.Items.Add(adress[i]);
form1.table.Next;
end;
end;

вот примерное такое?


linuxoid   (2010-07-26 12:05:00) [53]


> Ща тебя расстреляють за такое...

))) я в этом деле еще новичок


Anatoly Podgoretsky   (2010-07-26 12:00:00) [54]

А с этим циклом и не надо, ведь уже есть правильный цикл
while not form1.table.Eof do begin


Dennis I. Komarov   (2010-07-26 11:55:00) [55]

Ща тебя расстреляють за такое...


linuxoid   (2010-07-26 11:47:00) [56]


> // вот здесь извлечение из базы и передача в поток.


а как правильнее сделать?

с этим циклом у мения не получается...
form1.table.Open;
form1.table.First;
for i:=1 to form1.table.RecordCount do begin
adress[i]:=pchar(form1.table.Fields.FieldByName('nodeip').AsString);
form1.table.Next;
end;


Anatoly Podgoretsky   (2010-07-26 11:17:00) [57]

> linuxoid  (26.07.2010 10:52:08)  [8]

new1.freeonterminate := true;
// вот здесь извлечение из базы и передача в поток.
new1.resume;


linuxoid   (2010-07-26 10:52:00) [58]


> Именно здесь и передавать параметры для пинга одного дареса
> в поток.


адреса хостов находятся у меня в базе. и их предостаточно.
мне нужно же это как-то организовать в цикле.

form1.table.Open;
while not form1.table.Eof do begin
adress:=pchar(form1.table.FieldByName('nodeip').AsString);
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.resume;
end;
end;

примерно так оно должно выглядить?


Anatoly Podgoretsky   (2010-07-26 10:24:00) [59]

> linuxoid  (26.07.2010 10:04:06)  [6]

Именно здесь и передавать параметры для пинга одного дареса в поток.


linuxoid   (2010-07-26 10:04:00) [60]


> Поскольку это поток, то там цикл не нужен. Он должен быть
> внешним.


я так понял, значит цикл надо организовать здесь?

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.resume;
end;


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо