Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.10;
Скачать: CL | DM;

Вниз

помогите с пингом   Найти похожие ветки 

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

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

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

tablebase.Open;
tablebase.First;
for i:=1 to tablebase.recordcount do begin
adres:=tablebase.fields.Fields[2].AsString;
icmp.Host:=adres;
icmp.Ping();
listbox1.Items.Add("Время до хоста: "+" - "+inttostr(icmp.ReplyStatus.MsRoundTripTime)+"ms")
tablebase.Next;

скажите в чем проблема?


 
Dennis I. Komarov ©   (2010-07-12 13:19) [1]

На сосне висят два банана.

скажите в чем проблема?


 
Anatoly Podgoretsky ©   (2010-07-12 13:28) [2]

> linuxoid  (12.07.2010 13:05:00)  [0]

А у тебя есть проблема?


 
linuxoid   (2010-07-12 13:29) [3]

не перебирает по строкам.


 
linuxoid   (2010-07-12 13:33) [4]

точнее зависает при поочередном переборе


 
Anatoly Podgoretsky ©   (2010-07-12 13:42) [5]

используй while not eof


 
linuxoid   (2010-07-12 13:48) [6]

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


 
Юрий Зотов ©   (2010-07-12 13:52) [7]


> linuxoid   (12.07.10 13:48) [6]

1. Есть begin, а где end к нему? Похоже, не в том месте, где надо.
2. Не используйте RecordCount. См. [5].


 
Медвежонок Пятачок ©   (2010-07-12 13:54) [8]

хотелось бы чтоб она как пропингует один хост и сразу же добавил б отчет в листбокс.  

"она" в приведенном коде именно так и делает.


 
Anatoly Podgoretsky ©   (2010-07-12 13:56) [9]


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

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


 
Anatoly Podgoretsky ©   (2010-07-12 13:57) [10]

Свидетель постоянно путал показания.


 
linuxoid   (2010-07-12 14:00) [11]

end есть. забыл дописать.

tablebase.Open;
tablebase.First;
for i:=1 to tablebase.recordcount do begin
adres:=tablebase.fields.Fields[2].AsString;
icmp.Host:=adres;
icmp.Ping();
listbox1.Items.Add("Время до хоста: "+" - "+inttostr(icmp.ReplyStatus.MsRoundTripTime)+"ms")
tablebase.Next;
end;

если же в базу много хостов, то программа просто зависает.
когда использовал массив adres[i] программа поочередно пинговала хосты и добавляла в листбокс. а вот с базой проблемы.


 
Dennis I. Komarov ©   (2010-07-12 14:03) [12]

ProcessMessages; И куда бы ее поставить???


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

ну и как это можно решить?
я с ProcessMessages; не работал


 
12 ©   (2010-07-12 14:06) [14]

ассинхронный режим


 
Dennis I. Komarov ©   (2010-07-12 14:18) [15]


> 12 ©   (12.07.10 14:06) [14]

Воробьев не жалко?


 
Dennis I. Komarov ©   (2010-07-12 14:20) [16]


> linuxoid   (12.07.10 13:48) [6]

А зачем?


 
linuxoid   (2010-07-12 14:25) [17]

нужен наилучший вариант кода который проверит на наличие доступности хоста в сети.


 
Anatoly Podgoretsky ©   (2010-07-12 14:27) [18]

> linuxoid  (12.07.2010 14:05:13)  [13]

Ну тогда зачем вешаешь лапшу на уши, что с листбоксом у тебя работало.


 
Dennis I. Komarov ©   (2010-07-12 14:29) [19]


> нужен наилучший вариант кода который проверит на наличие
> доступности хоста в сети.

Что есть "доступность хоста"? Отлуп пинга еще ни о чем не говорит. Даже если получил ответ, далеко не факт, что через 5 сек. ты не получишь отлуп.

В чем сокровенный смысл сей операции?


 
linuxoid   (2010-07-12 14:32) [20]

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

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


 
Dennis I. Komarov ©   (2010-07-12 14:36) [21]


> прежнии код рабочии тока када много хостов она тупо зависает

он не туто записает, он тупо работает...

> отчет- доступен ли в сети хост или нет

Ну на какого он нужен?


 
linuxoid   (2010-07-12 14:38) [22]

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

и сразу же отчет добавлять в листбокс.
например.
192.168.0.1 - 0ms
или
192.168.0.2 - N/A.


 
Dennis I. Komarov ©   (2010-07-12 14:42) [23]


> путем пинга определить доступен ли хост или нет

С какого?

> например.
> 192.168.0.1 - 0ms

а через секунду уже N/A. И чего?

З.Ы. Про X, Y, Z КУ?


 
Anatoly Podgoretsky ©   (2010-07-12 14:45) [24]

> linuxoid  (12.07.2010 14:25:17)  [17]

Да ты справься сначала с простым, с наилучшим ты утонешь.


 
linuxoid   (2010-07-12 14:48) [25]

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

пытаюсь сделать аналог fpingera


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

> linuxoid  (12.07.2010 14:38:22)  [22]

Это не цель, а описание действий, цель например наказать тех, кто не
окажется в списке.


 
Anatoly Podgoretsky ©   (2010-07-12 14:50) [27]


> linuxoid   (12.07.10 14:48) [25]

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


 
linuxoid   (2010-07-12 14:52) [28]


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

ну и как это избежать?


 
Dennis I. Komarov ©   (2010-07-12 14:59) [29]


> вся эта процедура я закинул в timer с интервалов 30 секунд.
> так что через каждые 30 секунд она будет сканировать сеть.

Все, мы пропали...

> ну и как это избежать?

Так на кой ляд оно надо?


 
12 ©   (2010-07-12 15:01) [30]

да ладно, зато запустил и забыл
Когда админом в магазине работал, писал, все пинговалось и ругалось, если кто молчит в течении 2-3 минут
там чудненькие интерфейсы были - если пинга не было больше минут 5ти, девайс вылетал, причем при восстановлении пинга он не работал уже,
т.к. где то во вшитой в себя софтине уже никогда не определял что ping пошел.
Ты его пингуешь, он на уровне интерфейса бодренький, а команды игнорирует.

только выкл/вкл + рестарт службы на сервере, вот для того прожку и писал, там (SpeachAPI) еще он говорил мне куда идти :)
ща исходники искал, но не нашел. Наверное забыл про нее, когда уходил.

ассинхронно писал, помню
на получение ответа - взведение флага
по таймеру, если флаг взведен, - опять пинг.


 
linuxoid   (2010-07-12 15:02) [31]


> Так на кой ляд оно надо?


пытаюсь сделать аналог программы Friendly Pinger.


 
Dennis I. Komarov ©   (2010-07-12 15:09) [32]


> 12 ©   (12.07.10 15:01) [30]
там чудненькие интерфейсы были - если пинга не было больше минут 5ти, девайс вылетал, причем при восстановлении пинга он не работал уже,
т.к. где то во вшитой в себя софтине уже никогда не определял что ping пошел.

Вот видишь чего бывает от таких софтоваяниев...


> linuxoid   (12.07.10 15:02) [31]
>
> > Так на кой ляд оно надо?
>
>
> пытаюсь сделать аналог программы Friendly Pinger.

Как со стенкой... См. [26]


 
linuxoid   (2010-07-12 15:18) [33]


> Как со стенкой... См. [26]


не понял вопрос


 
Dennis I. Komarov ©   (2010-07-12 15:27) [34]


> цель. проверит на наличие доступности в сети хостов.

Зачем?

> главное просканировать сеть.
> пытаюсь сделать аналог fpingera

Зачем?

> пытаюсь сделать аналог программы Friendly Pinger.

...


 
Anatoly Podgoretsky ©   (2010-07-12 15:31) [35]


> не понял вопрос

Вопрос простой, зачем [26]


 
linuxoid   (2010-07-12 15:34) [36]

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


 
Dennis I. Komarov ©   (2010-07-12 15:46) [37]

нет ответа от пинга хоста - пошел, пнул, заработало... Так что ли? Это есть контроль? Не трогайте ее и она Вас не будет. А если у кого какой хост отвалится, то бдительные юзверы Вам об этом скажут быстрее, чем супер-пупер прога... :)


 
linuxoid   (2010-07-12 15:56) [38]

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


 
Anatoly Podgoretsky ©   (2010-07-12 15:58) [39]

> linuxoid  (12.07.2010 15:34:36)  [36]

Кто же сеть с помощью пинга контролирует,


 
linuxoid   (2010-07-12 16:00) [40]

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


 
Dennis I. Komarov ©   (2010-07-12 16:19) [41]


> но и  управляемые свичи находящиеся удаленно от меня

тем более...


 
linuxoid   (2010-07-12 16:27) [42]

возвращаюсь к исходному вопросу. Как бы мне все это реализовать?


 
faiwer ©   (2010-07-12 17:35) [43]

Вот так:

 tablebase.Open;
 tablebase.First;
 for i:=1 to tablebase.recordcount do begin
   adres:=tablebase.fields.Fields[2].AsString;
   icmp.Host:=adres;
   icmp.Ping();
   listbox1.Items.Add("Время до хоста: "+" - "+inttostr        
     (icmp.ReplyStatus.MsRoundTripTime)+"ms")
   Application.ProcessMessages;
   tablebase.Next;
 end;

Местные тебе весь мозг съедят. А я так понял - тебе прога нужна чисто временно чтобы не бегать и не напрягаться, врядли тебе изза этого захочется познавать дзен сетей и делфей )


 
Leonid Troyanovsky ©   (2010-07-12 20:42) [44]


> faiwer ©   (12.07.10 17:35) [43]

> нужна чисто временно чтобы не бегать и не напрягаться

Где ж он временно напрягся? Ну, или, побегал.

--
Regards, LVT.


 
linuxoid   (2010-07-13 08:40) [45]

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


 
brother ©   (2010-07-13 08:44) [46]

сколько штук? а то: cmd с ping не подойдет?


 
linuxoid   (2010-07-13 08:44) [47]


> faiwer ©   (12.07.10 17:35) [43]


все равно зависает. поищу другой подход.


 
brother ©   (2010-07-13 08:54) [48]

Файл ping10.1.1.1.cmd :
ping 10.1.1.1 - t
не подойдет?


 
linuxoid   (2010-07-13 08:59) [49]


> brother ©   (13.07.10 08:54) [48]


неа.

см.(22).


 
brother ©   (2010-07-13 09:15) [50]

[46] ?


 
linuxoid   (2010-07-13 09:30) [51]

количество неограничено. оно увеличивается. и через cmd будет неудобно. а с программным интерфейсом гораздо удобнее.


 
Dennis I. Komarov ©   (2010-07-13 09:33) [52]


> linuxoid   (13.07.10 08:44) [47]

Что есть зависание в твоем понятии?


 
linuxoid   (2010-07-13 09:42) [53]


> Что есть зависание в твоем понятии?


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


 
brother ©   (2010-07-13 09:49) [54]

[43] Application.ProcessMessages;
а не закрывается тк у тя цикл не закончился, делай принудительно выход из цикла

> for i:=1 to tablebase.recordcount do begin


 
brother ©   (2010-07-13 09:53) [55]

> а с программным интерфейсом гораздо удобнее.

А, так тебе шашечки? Значит не линуксоид ты)


 
Anatoly Podgoretsky ©   (2010-07-13 10:04) [56]

> linuxoid  (13.07.2010 08:40:45)  [45]

Тебе о проблемах соощат пользователи и вероятно, что пинг в этом случае
будет работать.
Это бессмысленная работа, точнее лишь бы не работать.


 
Anatoly Podgoretsky ©   (2010-07-13 10:09) [57]


> 12 ©   (12.07.10 14:06) [14]

В Инди то?


 
Anatoly Podgoretsky ©   (2010-07-13 10:11) [58]


> нужен наилучший вариант кода который проверит на наличие
> доступности хоста в сети.

Большинство файрволов имеют в составе verifier это штука помощнее, а не видимость проверки с пингом, что просто шоры на глаза. Иммитация работы.


 
linuxoid   (2010-07-13 10:12) [59]

а что если все данные вначале занести в массив adres[i].
затем пинг делать перебирая значение массива.

постоянное обращение к базе влияет?


 
Dennis I. Komarov ©   (2010-07-13 10:18) [60]


> постоянное обращение к базе влияет?

нет


 
linuxoid   (2010-07-13 10:21) [61]

вот нашел аналог. хотелось бы такое. здесь просто задается диапазон ip.
а в моей они должны братся из базы.

http://www.delphisources.ru/pages/sources/internet/2007_year/ping_thread.html


 
Dennis I. Komarov ©   (2010-07-13 10:23) [62]


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

Ну так она работает, а не зависает. Чего ты ее дергаешь? Выноси пинг в отдельный поток если тебе кнопки жать хоца...
Правда, ИМХО, там грабель насобирашь...


 
brother ©   (2010-07-13 10:26) [63]

> Выноси пинг в отдельный поток если тебе кнопки жать хоца...
>
> Правда, ИМХО, там грабель насобирашь...

вот вот, я хотел посоветовать - потом передумал)


 
brother ©   (2010-07-13 10:30) [64]

кстати:

> нужно поочередно всех пропинговать.

в [54] иже с ним, так и делается, а не реакция - работает...)


 
linuxoid   (2010-07-13 10:40) [65]

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


 
faiwer ©   (2010-07-13 10:52) [66]

linuxoid
1. я в твой код добавил Application.ProcessMessages - это гарантирует то, что твой ListBox будет пополнятся постепенно, а не разом после всех пингов
2. если ты хочешь чтобы не зависал интерфейс - тебе надо выносить сетевую часть в отдельный поток. Что то мне подсказывает, что после пары статей про потоки, ты передумаешь, и захочешь чтобы зависало дальше )


 
faiwer ©   (2010-07-13 10:58) [67]

Объясню по понятнее.
Твоя программа (я имею ввиду твои процедуры и функции) и её интерфейс работают в одном потоке. Если поток чем то занят, он чтото делает, то чтото другое он не делает. Поток не может делать сразу два дела в 1 момент времени. Поетому когда ты его нагружаешь пингами, он не может перерисовать ListBox, чтобы там повился новый элемент, и не может обработать твои нажатия на эдитки, кнопки и прочие вещи - ибо он "пингует", он всё ещё внутри цикла.

Application.ProcessMessages - временно выполняет скопившиеся задачи, то есть если листбокс хотел нарисовать новый элемент - он его нарисует, по окончанию списка задач, твоя программа вновь пингует. Поетому никакие едитки не пашут. Список обновился, но интерфейс так и остаётся деревянным. Потоку не до этого, он пингует.

Ты можешь вынести пинг-инг в отдельный поток, тогда ничерта зависать не будет, но во первых, тебе придётся прочитать 100500 статей, научится синхронизировать работу с тем же ListBox-ом, да и просто написать много костылей. Если ты чем то (для тебя) сложным в делфях уже занимался, то потоки на голову сложнее :)

P.S. сетевые программы, музыкальные программы даже небольшой сложности обязательно разграничены на 1-2-3...999 потоков )


 
linuxoid   (2010-07-13 11:08) [68]


> faiwer ©   (13.07.10 10:58) [67]

спс. теперь понял.

в этой проге -
http://www.delphisources.ru/pages/sources/internet/2007_year/ping_thread.html

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


 
faiwer ©   (2010-07-13 11:15) [69]


> почему так нельзя сделать, или в этой проге используют нескоко
> потоков?
> может дело в другом методе?

Дело в потоках, вот это:

TThreadScan = class(TThread)
    msg : string;
    msg2 : string;
private
    BeginAddr: integer;
    EndAddr: integer;
    Timeout: DWORD;
    procedure UpdateMemo;
    procedure UpdateStatusBar;
    procedure UpdateScanned;
protected
    procedure Execute; override;
public
    constructor Create(a,b:integer);
end;


Отдельный поток.


 
linuxoid   (2010-07-13 11:17) [70]


>
> Отдельный поток.

спасибо. теперь постараюсь сам разобраться.


 
brother ©   (2010-07-13 11:27) [71]

Блин, ты без потоков бы попробовал разобраться!
Держи и смотри как...
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdRawBase, IdRawClient,
 IdIcmpClient, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ListBox1: TListBox;
   IdIcmpClient1: TIdIcmpClient;
   Timer1: TTimer;
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
 private

 public
   Work: boolean;
   IpList: array of string;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 i: integer;
begin
 SetLength(IpList, 21);
 for i:= 1 to High(IpList) do
   IpList[i]:= "10.1.1." + IntToStr(i);

 IdIcmpClient1.ReceiveTimeout:= 200;
 Work:= False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i: integer;
begin
 if Work then
   Exit
 else
   Work:= True;

 ListBox1.Items.Clear;
 for i:= 1 to High(IpList) do
 begin
   IdIcmpClient1.Host:= IpList[i];
   IdIcmpClient1.Ping();
   ListBox1.Items.Add("10.1.1. " + inttostr(i) + " :" +  inttostr(IdIcmpClient1.ReplyStatus.MsRoundTripTime)+"ms");
   Application.ProcessMessages;
   if not Work then
     Break;
 end;
 Work:= False;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Work:= False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled:= not Timer1.Enabled;
end;

end.


 
linuxoid   (2010-07-13 12:48) [72]


> begin
>  if Work then
>    Exit
>  else
>    Work:= True;


вот эти не понятны что то?


 
ixen   (2010-07-13 15:20) [73]

а постоянными пингами, не ухудшится ли обмен пакетами в сети?


 
brother ©   (2010-07-14 04:59) [74]

> вот эти не понятны что то?

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

имхо нагрузка не велика - нет


 
brother ©   (2010-07-14 05:05) [75]

> вот эти не понятны что то?

странно, но все остальное понятно??? Тогда - дерзай! Удачи!


 
Anatoly Podgoretsky ©   (2010-07-14 10:05) [76]


> вот вот, я хотел посоветовать - потом передумал)

Пожалел :-)


 
Anatoly Podgoretsky ©   (2010-07-14 10:06) [77]


> Application.ProcessMessages - временно выполняет скопившиеся
> задачи

Что неправда, никаких задач, кроме ProcessMessages он не выполняет


 
Anatoly Podgoretsky ©   (2010-07-14 10:09) [78]


> procedure TForm1.Timer1Timer(Sender: TObject);

Это ты зря, ведешь его к stack overflow


 
Anatoly Podgoretsky ©   (2010-07-14 10:10) [79]


> Anatoly Podgoretsky ©   (14.07.10 10:09) [78]

Эту функцию, если оставлять, то надо переписывать, чтобы не возникла указаная проблема.


 
brother ©   (2010-07-14 11:19) [80]

> Это ты зря, ведешь его к stack overflow

в каком случае это будет?
зы интервал таймера 1000


 
Anatoly Podgoretsky ©   (2010-07-14 13:24) [81]

> brother  (14.07.2010 11:19:20)  [80]

Возможен повторный запуск в течение интервала. Надо просто исправить
функцию, что бы даже надежды на подобное не было.


 
brother ©   (2010-07-14 15:08) [82]

> Возможен повторный запуск в течение интервала

нет

if Work then
  Exit
else
  Work:= True;

не даст этого


 
Anatoly Podgoretsky ©   (2010-07-14 16:25) [83]

Application.ProcessMessages; перед этим позволит это.


 
Anatoly Podgoretsky ©   (2010-07-14 16:26) [84]

Тут нарушены принципы безопасной работы с сообщениями, таймер должен быть запрещен при входе и разрешен (при необходимости) при выходе из метода.


 
brother ©   (2010-07-15 08:19) [85]

Можно показать, как бы сделали вы?


 
Leonid Troyanovsky ©   (2010-07-15 08:44) [86]


> brother ©   (15.07.10 08:19) [85]

> Можно показать, как бы сделали вы?

Translate:

> таймер должен быть запрещен при входе и разрешен (при необходимости)
> при выходе из метода.


with Sender as TTimer do
 begin
   Enabled := False;
   ..
   Enabled := IsNeeded;
 end;

--
Regards, LVT.


 
brother ©   (2010-07-15 08:47) [87]

те на входе - тормозим, а на выходе стартуем... это понятно, но не понятно в каком случае

> if Work then
>   Exit
> else
>   Work:= True;

может дать stack overflow? простой пример, я чет не представляю, а хотелось бы...


 
Leonid Troyanovsky ©   (2010-07-15 09:58) [88]


> brother ©   (15.07.10 08:47) [87]

> может дать stack overflow? простой пример, я чет не представляю,
>  а хотелось бы...

Stack overflow на моем w2k3 сервере не получился.

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i : Longint;
begin
 for i := 0 to 1000000 do
   canvas.TextOut(0, 0, IntTostr(i));
 OutputDebugString(PChar( IntTostr(GetQueueStatus(QS_TIMER))));
end;

Максимум, что получилось - 1048592.

--
Regards, LVT.


 
brother ©   (2010-07-15 10:06) [89]

> if Work then
>  Exit
> else
>  Work:= True;

алгоритм где?


 
Anatoly Podgoretsky ©   (2010-07-15 10:09) [90]

> brother  (15.07.2010 08:47:27)  [87]

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


 
Anatoly Podgoretsky ©   (2010-07-15 10:10) [91]

> Leonid Troyanovsky  (15.07.2010 09:58:28)  [88]

А где у тебя обработка событий? Без нее не получится


 
brother ©   (2010-07-15 10:16) [92]

> у тебя есть ProcessMessages, который может получить
> следующий тик таймера,

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
begin
if Work then
  Exit
else
  Work:= True;

ListBox1.Items.Clear;
for i:= 1 to High(IpList) do
begin
  IdIcmpClient1.Host:= IpList[i];
  IdIcmpClient1.Ping();
  ListBox1.Items.Add("10.1.1. " + inttostr(i) + " :" +  inttostr(IdIcmpClient1.ReplyStatus.MsRoundTripTime)+"ms");
  Application.ProcessMessages; те тут вероятен вызов таймера еще раз? если да, то в начале выхзова мы его прекратим выходом из Timer1Timer!?
  if not Work then
    Break;
end;
Work:= False;
end;


 
Leonid Troyanovsky ©   (2010-07-15 11:06) [93]


> Anatoly Podgoretsky ©   (15.07.10 10:10) [91]

> А где у тебя обработка событий? Без нее не получится

Yes! Получил-таки AV:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i, j : Longint;
begin
 for i := 0 to 100 do
   begin
     for j := 0 to 100000  do
       canvas.TextOut(0, 0, IntTostr(j));
     // OutputDebugString(PChar( IntTostr(GetQueueStatus(QS_TIMER))));
     Application.ProcessMessages;
   end;
end;

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-07-15 11:51) [94]


> brother ©   (15.07.10 10:16) [92]

>   Application.ProcessMessages; те тут вероятен вызов таймера
> еще раз? если да, то в начале выхзова мы его прекратим выходом
> из Timer1Timer!?

Зачем рисковать.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2010-07-15 13:25) [95]

> Leonid Troyanovsky  (15.07.2010 11:06:33)  [93]

Леонид тебе надо много тренироваться, но когда нибудь получишь stack
overflow
Короче если не запрещать таймер в начале процедуры, то это всегда игра в
русскую рулетку.


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

> Leonid Troyanovsky  (15.07.2010 11:51:34)  [94]

Это ему только кажется что он сможет прекратить, на самом деле будет
запущена новая копия и так возможно до бесконечности.
Я не понимаю зачес спорить с очевидным?


 
Leonid Troyanovsky ©   (2010-07-15 13:44) [97]


> Anatoly Podgoretsky ©   (15.07.10 13:25) [95]

> Леонид тебе надо много тренироваться, но когда нибудь получишь

Он постарается (c)
:)

--
Regards, LVT.



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

Текущий архив: 2010.10.10;
Скачать: CL | DM;

Наверх




Память: 0.72 MB
Время: 0.012 c
2-1279431185
Study
2010-07-18 09:33
2010.10.10
Работа с файлами концигурации


2-1279461553
@!!ex
2010-07-18 17:59
2010.10.10
Закрытие приложения из сервиса


6-1226523867
cerber
2008-11-13 00:04
2010.10.10
Idhttp и загрузка динамических изображений


2-1279537002
GanibalLector
2010-07-19 14:56
2010.10.10
Артефакты HINT а


2-1279203188
Nurjanov
2010-07-15 18:13
2010.10.10
Отчет в Excel по шаблону с неизвестным количеством строк