Форум: "Начинающим";
Текущий архив: 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]
> Тебе столько написали, что ты уже должен был сделать сразу
> несколькими
> путями.
можете наглядный алгоритм написать. пытаюсь но что то у мя выходит
← →
Anatoly Podgoretsky © (2010-07-26 13:52) [41]Вроде уже в самом начале ЮЗ представил алгоритм в виде кода.
1. Проход по базе, от начала до конца;
2. Выборка ИП для пинга из базы;
3. Вызов пинга (в потоке или последовательно);
4. переход к следующей иттерации.
Каждый кусок по отдельности уже фигурировал, собирай в целое. Это запускать внутри цикла таймера.
← →
linuxoid (2010-07-26 14:11) [42]
>
> Каждый кусок по отдельности уже фигурировал, собирай в целое.
> Это запускать внутри цикла таймера.
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 14:45) [43]> linuxoid (26.07.2010 14:11:42) [42]
Как будто ничего не говорили, не проходит по циклу, поскольку это у тебя вне
цикла.
← →
linuxoid (2010-07-26 14:51) [44]
>
> Как будто ничего не говорили, не проходит по циклу, поскольку
> это у тебя вне
> цикла.
а как теперь тада передать данные в поток в цикле?
← →
Anatoly Podgoretsky © (2010-07-26 14:53) [45]> linuxoid (26.07.2010 14:51:44) [44]
Поток.поле := значение
Поток.свойство := значение
← →
linuxoid (2010-07-26 15:07) [46]
> Поток.поле := значение
> Поток.свойство := значение
а как это будет в коде выглядить?
← →
Dennis I. Komarov © (2010-07-26 15:12) [47]
new1.adrees:=Dataset.FieldByName("adress").AsString;
← →
linuxoid (2010-07-26 15:22) [48]
> > Поток.свойство := значение
какое свойство должно описываться?
← →
Юрий Зотов © (2010-07-26 15:35) [49]
> linuxoid (26.07.10 15:22) [48]
Может быть, прежде, чем заниматься объектно-ориентированным программированием в Delphi, есть смысл прочитать хотя бы одну книжку по нему?
Можете поверить - даже самая простая книга, даже уровня "для начинающих" сняла бы у Вас огромную кучу вопросов и сэкономила бы массу времени.
← →
Anatoly Podgoretsky © (2010-07-26 15:46) [50]> linuxoid (26.07.2010 15:07:46) [46]
Так и будет выглядеть, только замени на английский
← →
Anatoly Podgoretsky © (2010-07-26 15:47) [51]> linuxoid (26.07.2010 15:22:48) [48]
Я тебе уже говорил, не лезь во свойства, тебе это тяжело, используй поля
← →
sniknik © (2010-07-26 15:51) [52]> Можете поверить - даже самая простая книга, даже уровня "для начинающих" сняла бы у Вас огромную кучу вопросов и сэкономила бы массу времени.
и опять, почти дословно, тот же совет ему дают ... "а воз и нынче там" ;)
← →
linuxoid (2010-07-26 16:02) [53]procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.Processmessages;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.adress:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
new1.Resume;
form1.table.Next;
end;
end;
вот попробовал сделать так. работает около 5 минит затем выскакивает сообщение с ошибкой "access violation at address 06783007 in module "bordbk70.dll". read of address 0b880000";
← →
Dennis I. Komarov © (2010-07-26 16:11) [54]
> linuxoid (26.07.10 16:02) [53]
Значит у тебя ошибка в программе...
← →
linuxoid (2010-07-26 16:32) [55]
> > linuxoid (26.07.10 16:02) [53]
>
> Значит у тебя ошибка в программе...
а какая может быть ошибка и тем более возникает через минут 5?
← →
Юрий Зотов © (2010-07-26 16:35) [56]Это срабатывает внутренний таймер VCL.
← →
linuxoid (2010-07-26 16:39) [57]чтобы исправить эту ошибку нужно что-то дописать или в коде исправить какие то моменты?
← →
Dennis I. Komarov © (2010-07-26 17:14) [58]Чтобы работать с потоками надо понимать их... а ты пишешь не понимая того, что пишешь...
← →
Anatoly Podgoretsky © (2010-07-26 20:18) [59]
> linuxoid (26.07.10 16:02) [53]
Тебя уже спрашивали про эти странные переменныеform1
new1
Ты же никаких выводов из этого не сделал.
← →
linuxoid (2010-07-27 08:23) [60]вот два листинга программы.
main
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, thrd, DB, ADODB, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
conn: TADOConnection;
table: TADOTable;
tablenodeid: TAutoIncField;
tableparentid: TIntegerField;
tablenodename: TWideStringField;
tablenodetype: TIntegerField;
tablenodeip: TWideStringField;
tablenodeother: TWideStringField;
Timer1: TTimer;
ListBox1: TListBox;
dstable: TDataSource;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
new1:TThreadScan;
hThread:array of array of Cardinal;
{ Public declarations }
end;
var
Form1: TForm1;
//adress: array [1..30] of pansichar;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
table.Open;
table.First;
while not form1.table.Eof do begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.adress:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
new1.Resume;
table.Next;
end;
end;
end.
← →
linuxoid (2010-07-27 08:26) [61]это второй листинг.
thrd
unit thrd;
interface
uses
Windows, SysUtils, Classes,
StdCtrls, winsock;
type
TThreadScan = class(TThread)
adress: string;
private
msg: string;
procedure addstr;
{ Private declarations }
protected
procedure Execute; override;
end;
type
ip_option_information = packed record
Ttl : byte;
Tos : byte;
Flags : byte;
OptionsSize : byte;
OptionsData : Pointer;
end;
icmp_echo_reply = packed record
Address : u_long;
Status : u_long;
RTTime : u_long;
DataSize : u_short;
Reserved : u_short;
Data : Pointer;
Options : ip_option_information;
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;
DestAddress : u_long;
RequestData : PVOID;
RequestSize : Word;
RequestOptns : PIPINFO;
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:integer;
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(pchar(adress));
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();
IPReply:=("Reply from "+
IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
IntToStr(HiByte(HiWord(pIpe^.Address))));
if (error <> 0) then
begin
msg:=(IPReply+" N/A");
synchronize(addstr);
exit;
end;
msg:=(IPReply+"Reply time: "+IntToStr(pIpe.RTTime)+" ms");
synchronize(addstr);
IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
end;
end.
← →
Dennis I. Komarov © (2010-07-27 15:43) [62]
> вот два листинга программы.
и нафига они нам?
> procedure TThreadScan.addstr;
> begin
> Form1.ListBox1.Items.Add(msg);
> end;
И откуда такое чудо вычитано?
← →
Плохиш © (2010-07-28 01:17) [63]
> linuxoid (27.07.10 08:23) [60]
>
> вот два листинга программы.
Не вижу листингов, только маразматические испражнения...
← →
Германн © (2010-07-28 01:50) [64]
> Плохиш © (28.07.10 01:17) [63]
>
>
Я уже давно плюнул на эти испражнения.
← →
Anatoly Podgoretsky © (2010-07-28 08:38) [65]> Плохиш (28.07.2010 01:17:03) [63]
А нафига тебе листинги без вопросов?
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];
Память: 0.64 MB
Время: 0.006 c