Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Вниз

как правильнее составить цикл?   Найти похожие ветки 

 
linuxoid   (2010-07-26 08:26) [0]

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

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

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.


 
Юрий Зотов ©   (2010-07-26 08:53) [1]

with Query do
begin
 Text := "select IP from ... where ...";
 Open;
 while not EoF do
   пинг(FieldByName(IP).As...)
end;


 
linuxoid   (2010-07-26 09:07) [2]

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


 
Anatoly Podgoretsky ©   (2010-07-26 09:17) [3]

// начало цикла
//конец цикла

Здесь нет цикла.


 
linuxoid   (2010-07-26 09:31) [4]


> Здесь нет цикла.


вот и я хочу чтоб, то что там написано внутри цикла...


 
Anatoly Podgoretsky ©   (2010-07-26 10:01) [5]

> linuxoid  (26.07.2010 09:31:04)  [4]

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


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


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


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

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


 
Anatoly Podgoretsky ©   (2010-07-26 10:24) [7]

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

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


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


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


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

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 11:17) [9]

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

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


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


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


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

с этим циклом у мения не получается...
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;


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

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


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

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


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


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

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


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


> А с этим циклом и не надо, ведь уже есть правильный цикл
> 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;

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


 
Anatoly Podgoretsky ©   (2010-07-26 12:16) [15]

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

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


 
Anatoly Podgoretsky ©   (2010-07-26 12:17) [16]

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

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


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

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;


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

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


 
brother ©   (2010-07-26 12:38) [19]

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


 
brother ©   (2010-07-26 12:40) [20]

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


 
brother ©   (2010-07-26 12:41) [21]

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


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


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


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


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


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


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


 
brother ©   (2010-07-26 12:49) [24]

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


 
Anatoly Podgoretsky ©   (2010-07-26 12:51) [25]

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

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


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

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;

здесь он передает токо один хост


 
brother ©   (2010-07-26 12:52) [27]

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

согласен на сабж ответили)


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

> brother  (26.07.2010 12:40:20)  [20]

А также new1 и неизвестно какой form1 используется
Вот я и говорю, что до начинающих еще далеко. Пока идет бездумный перебор
кодовых кусков.


 
linuxoid   (2010-07-26 12:54) [29]


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


а какие должны быть параметры цикла?


 
brother ©   (2010-07-26 12:56) [30]

перекрывай конструктор TThread, добавляй еще один параметр, при создании будешь подсовывать конструктору адресс, и он будет стартовать с нужным адресом...
зы ты так и не ответил, где описана    //adress : array [1..30] of pansichar;


 
brother ©   (2010-07-26 12:56) [31]

> Вот я и говорю, что до начинающих еще далеко. Пока идет
> бездумный перебор

согласен, чет надоело уже... учи мат часть!


 
Anatoly Podgoretsky ©   (2010-07-26 13:00) [32]

> linuxoid  (26.07.2010 12:54:29)  [29]

А про какой цикл спрашиваешь?


 
Anatoly Podgoretsky ©   (2010-07-26 13:00) [33]

> brother  (26.07.2010 12:56:30)  [30]

Совсем не обязательно, можно присвоить свойству/члену без всякого
перекрытия.


 
linuxoid   (2010-07-26 13:00) [34]


> зы ты так и не ответил, где описана    //adress : array
> [1..30] of pansichar;

это я исползовал вначале, када использовал обычный цикл.


 
linuxoid   (2010-07-26 13:03) [35]


> А про какой цикл спрашиваешь?


Anatoly Podgoretsky ©   (26.07.10 12:51) [25]

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

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


 
brother ©   (2010-07-26 13:03) [36]

> можно присвоить свойству/члену без всякого
> перекрытия.

можно, чет в "не те степи" меня прет)


 
Anatoly Podgoretsky ©   (2010-07-26 13:21) [37]

> brother  (26.07.2010 13:03:36)  [36]

Пытаешься сложно делать, а ты отнесись как к обычному классу, со своими
членами и свойтвами, я за свойство, но Линуксоид погибнет с ними, пусть
делает обычного public члена класса.


 
linuxoid   (2010-07-26 13:26) [38]


> Anatoly Podgoretsky ©   (26.07.10 13:21) [37]


но все же как мне быть с этим. как поступить с этим циклом?


 
Anatoly Podgoretsky ©   (2010-07-26 13:39) [39]

> linuxoid  (26.07.2010 13:26:38)  [38]

Тебе столько написали, что ты уже должен был сделать сразу несколькими
путями.


 
linuxoid   (2010-07-26 13:42) [40]


> Тебе столько написали, что ты уже должен был сделать сразу
> несколькими
> путями.


можете наглядный алгоритм написать. пытаюсь но что то у мя выходит



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.003 c
2-1280746142
И. Павел
2010-08-02 14:49
2010.10.24
Полиморфизм без наследования.


2-1280317799
zlo
2010-07-28 15:49
2010.10.24
Мьютексы


2-1280818376
12
2010-08-03 10:52
2010.10.24
delphi - oracle - null параметр


15-1279407333
Германн
2010-07-18 02:55
2010.10.24
Replace in files. (Очередной дурацкий вопрос от Германна :)


15-1279480343
KilkennyCat
2010-07-18 23:12
2010.10.24
Сапожники без сапог....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский