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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.71 MB
Время: 0.006 c
15-1279013407
Knight
2010-07-13 13:30
2010.10.10
Почему TServerSocket при отключении клиента...


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


2-1278925532
linuxoid
2010-07-12 13:05
2010.10.10
помогите с пингом


2-1278787052
Nikfel
2010-07-10 22:37
2010.10.10
Как из RichEdit получить и засунуть текст в формате RTF?


2-1279601277
Андрей_1
2010-07-20 08:47
2010.10.10
Цвет шрифта DBGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский