![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IdIcmpClient&exception
kernel © (2006-12-07 19:42:00)Доброго времени суток.
Проблема у меня такая: с помощью IdIcmpClient в консольном приложениипингую какой-нибудь хост, и если хост не существует или не доступен, то происходит "вылетание" из моего консольника (exception). Как избежать этого "вылетания"? try, except не помагают. Заранее, спасибо...
kernel (2006-12-12 16:17:00) [1]Спасибо, все понял :)
Сергей М. (2006-12-12 16:04:00) [2]
> except
> RWriteErrorMsgLn(pchar('Error #'+inttostr(GetLastError)+':
> '+
> SysErrorMessage(GetLastError)));
> Sleep(1000);
> end;
Все связанное с GetLastError() в твоем обработчике Делфи-исключения - что корове седло. Убирай.
И sleep() тоже убирай - не нужен он здесь ни под каким соусом.
Сергей М. (2006-12-12 16:01:00) [3]
> kernel © (12.12.06 15:38) [15]
Не "вылетает", а приложение завершается согласно твоейлогике.
Заключи в try..except тело for-цикла.
kernel (2006-12-12 15:38:00) [4]
> Я тебя не спрашиваю, что там у тебя что-то там "отображает".
>
> Я спрашиваю, при выполнении какой конкретно строчки твоего
> кода это происходит !
>
> Это строчка - sleep() ? Или какая ?
Само exception происходит при вызовеMTPing.Ping(HostsList[HostsListI]);в случае если хост не существует. Далее программа выполняет
RWriteErrorMsgLn(pchar('Error #'+inttostr(GetLastError)+': '+
SysErrorMessage(GetLastError)));
Sleep(1000);
и вылетает.
Сергей М. (2006-12-12 15:28:00) [5]Я тебя не спрашиваю, что там у тебя что-то там "отображает".
Я спрашиваю, при выполнении какой конкретнострочки твоего кодаэто происходит !
Это строчка - sleep() ? Или какая ?
kernel (2006-12-12 15:14:00) [6]
> Что значит "после" ?
Это значит, что отображает "Error #00000 [описание ошибки]" и через секунду вылетает.
Сергей М. (2006-12-11 10:07:00) [7]
> вылетает он после sleep
Что значит "после" ?
kernel (2006-12-09 08:02:00) [8]А может быть из-за того, что приложение пишется на BDS2006? там indy10 :/
kernel (2006-12-08 18:10:00) [9]вылетает он после sleep(1000)
Anatoly Podgoretsky (2006-12-08 11:21:00) [10]Врет конечно
Сергей М. (2006-12-08 10:13:00) [11]т.е. ты утверждаешь, что брейкпойнт
except
RWriteErrorMsgLn(pch ... // <- здесь
не срабатывает ?
kernel (2006-12-08 09:21:00) [12]program mping;
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes,
Windows,
IdIcmpClient,
IdBaseComponent,
IdComponent,
IdRawBase,
IdRawClient;
type
TMTPing = class
procedure ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);
procedure Ping(Host: string);
end;
var
i: integer;
ICMP: TIdIcmpClient;
MTPing: TMTPing;
HostsList: TStringList;
HostsListI: cardinal;
p_str_: string;
pc_card_: Cardinal;
hndl: THandle;
procedure RWriteErrorMsgLn(RLine: PChar);
var
tmpstr: string;
begin
SetConsoleTextAttribute(hndl, 12);
tmpstr:=RLine;
CharToOem(PChar(tmpstr), PChar(tmpstr));
Writeln(' '+tmpstr);
SetConsoleTextAttribute(hndl, 7);
end;
procedure TMTPing.ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);
var
sTime: string;
begin
if (ReplyStatus.MsRoundTripTime = 0) then
sTime := '<1'
else
sTime := '=';
Writeln(Format('%d bytes from %s: TTL=%d time%s%d ms',
[ReplyStatus.BytesReceived,
ReplyStatus.FromIpAddress,
ReplyStatus.TimeToLive,
sTime, ReplyStatus.MsRoundTripTime]));
end;
procedure TMTPing.Ping(Host: string);
begin
ICMP.OnReply := ICMPReply;
ICMP.ReceiveTimeout := 1000;
try
ICMP.Host := Host;
for i := 1 to 4 do begin
ICMP.Ping;
Sleep(500);
end;
finally
end;
end;
function FieldClear(s: string):boolean;
var
f_index_:Cardinal;
begin
Result:=True;
for f_index_:=1 to Length(s) do begin
if (s[f_index_]<>' ')
and (s[f_index_]<>'')
then Result:=False;
end;
end;
function StringToStringList(SrcStr: string;
var DstStrLst: TStringList):boolean;
var
line_i: Cardinal;
line_s:string;
begin
Result:=false;
line_s:='';
if (Length(SrcStr)>0)
and (FieldClear(SrcStr)=false) then begin
for line_i:=1 to Length(SrcStr) do begin
if ord(SrcStr[line_i])<>32
then line_s:=line_s+SrcStr[line_i];
if ord(SrcStr[line_i])=32 then begin
if FieldClear(line_s)=false
then DstStrLst.Add(line_s);
line_s:='';
end;
if line_i=Length(SrcStr) then begin
if FieldClear(line_s)=false
then DstStrLst.Add(line_s);
line_s:='';
end;
end;
Result:=true;
end;
end;
begin
try
p_str_:='';
hndl:=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hndl, 7);
Writeln;
if ParamCount=0 then Halt(0);
if ParamCount>0 then begin
for pc_card_ := 1 to ParamCount do
p_str_:=p_str_+ParamStr(pc_card_)+' ';
end else Halt(0);
if FieldClear(p_str_)=true then Halt(0);
HostsList:=TStringList.Create;
HostsList.Clear;
if not StringToStringList(p_str_, HostsList) then Halt(0);
ICMP:=TIdIcmpClient.Create(nil);
for HostsListI := 0 to HostsList.Count - 1 do begin
Writeln('Host: '+HostsList[HostsListI]);
Writeln;
MTPing.Ping(HostsList[HostsListI]);
Writeln;
end;
ICMP.Free;
HostsList.Free;
Readln;
except
RWriteErrorMsgLn(pchar('Error #'+inttostr(GetLastError)+': '+
SysErrorMessage(GetLastError)));
Sleep(1000);
end;
end.
Сергей М. (2006-12-08 09:17:00) [13]
> kernel © (08.12.06 09:15) [5]
Вот и показывай, как ты доработал этот пример до "консольного" вида
kernel (2006-12-08 09:15:00) [14]Это код то же самое, что и в папке [Delphi]\Demos\Indy\PingGUI только в консольном виде.
Сергей М. (2006-12-08 09:07:00) [15]
> В обычном приложении помогают, а в консольном происходит
> "вылет".
"Обычное" приложение с т.з. механизма обработки исключений ничем не отличается от консольного.
Показывай код ...
kernel (2006-12-08 06:57:00) [16]
> Ты точно уверен, что try, except не помогают?
В обычном приложении помогают, а в консольном происходит "вылет".
Dmitrij_K (2006-12-07 22:17:00) [17]
> try, except не помагают.
Очень помогает
Anatoly Podgoretsky (2006-12-07 20:15:00) [18]> kernel (07.12.2006 19:42:00) [0]
Ты точно уверен, что try, except не помогают?