![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как правильнее составить цикл?
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 14:53:00) [21]> linuxoid (26.07.2010 14:51:44) [44]
Поток.поле := значение
Поток.свойство := значение
linuxoid (2010-07-26 14:51:00) [22]
>
> Как будто ничего не говорили, не проходит по циклу, поскольку
> это у тебя вне
> цикла.
а как теперь тада передать данные в поток в цикле?
Anatoly Podgoretsky (2010-07-26 14:45:00) [23]> linuxoid (26.07.2010 14:11:42) [42]
Как будто ничего не говорили, не проходит по циклу, поскольку это у тебя вне
цикла.
linuxoid (2010-07-26 14:11:00) [24]
>
> Каждый кусок по отдельности уже фигурировал, собирай в целое.
> Это запускать внутри цикла таймера.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
adress:=pchar(form1.table.Fields.FieldByName('nodeip').AsString);
new1.resume;
form1.table.Next;
end;
end;
вот собрал. но здесь он по циклу не проходит. берет только последнее значение из базы.
Anatoly Podgoretsky (2010-07-26 13:52:00) [25]Вроде уже в самом начале ЮЗ представил алгоритм в виде кода.
1. Проход по базе, от начала до конца;
2. Выборка ИП для пинга из базы;
3. Вызов пинга (в потоке или последовательно);
4. переход к следующей иттерации.
Каждый кусок по отдельности уже фигурировал, собирай в целое. Это запускать внутри цикла таймера.
linuxoid (2010-07-26 13:42:00) [26]
> Тебе столько написали, что ты уже должен был сделать сразу
> несколькими
> путями.
можете наглядный алгоритм написать. пытаюсь но что то у мя выходит
Anatoly Podgoretsky (2010-07-26 13:39:00) [27]> linuxoid (26.07.2010 13:26:38) [38]
Тебе столько написали, что ты уже должен был сделать сразу несколькими
путями.
linuxoid (2010-07-26 13:26:00) [28]
> Anatoly Podgoretsky © (26.07.10 13:21) [37]
но все же как мне быть с этим. как поступить с этим циклом?
Anatoly Podgoretsky (2010-07-26 13:21:00) [29]> brother (26.07.2010 13:03:36) [36]
Пытаешься сложно делать, а ты отнесись как к обычному классу, со своими
членами и свойтвами, я за свойство, но Линуксоид погибнет с ними, пусть
делает обычного public члена класса.
brother (2010-07-26 13:03:00) [30]> можно присвоить свойству/члену без всякого
> перекрытия.
можно, чет в "не те степи" меня прет)
linuxoid (2010-07-26 13:03:00) [31]
> А про какой цикл спрашиваешь?
Anatoly Podgoretsky © (26.07.10 12:51) [25]
> linuxoid (26.07.2010 12:27:17) [17]
Теперь все это в цикле
Anatoly Podgoretsky (2010-07-26 13:00:00) [32]> brother (26.07.2010 12:56:30) [30]
Совсем не обязательно, можно присвоить свойству/члену без всякого
перекрытия.
linuxoid (2010-07-26 13:00:00) [33]
> зы ты так и не ответил, где описана //adress : array
> [1..30] of pansichar;
это я исползовал вначале, када использовал обычный цикл.
Anatoly Podgoretsky (2010-07-26 13:00:00) [34]> linuxoid (26.07.2010 12:54:29) [29]
А про какой цикл спрашиваешь?
brother (2010-07-26 12:56:00) [35]> Вот я и говорю, что до начинающих еще далеко. Пока идет
> бездумный перебор
согласен, чет надоело уже... учи мат часть!
brother (2010-07-26 12:56:00) [36]перекрывай конструктор TThread, добавляй еще один параметр, при создании будешь подсовывать конструктору адресс, и он будет стартовать с нужным адресом...
зы ты так и не ответил, где описана //adress : array [1..30] of pansichar;
linuxoid (2010-07-26 12:54:00) [37]
> Теперь все это в цикле
а какие должны быть параметры цикла?
Anatoly Podgoretsky (2010-07-26 12:54:00) [38]> brother (26.07.2010 12:40:20) [20]
А также new1 и неизвестно какой form1 используется
Вот я и говорю, что до начинающих еще далеко. Пока идет бездумный перебор
кодовых кусков.
brother (2010-07-26 12:52:00) [39]> Теперь все это в цикле
согласен на сабж ответили)
linuxoid (2010-07-26 12:52:00) [40]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;
здесь он передает токо один хост