Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2016, 13:36   #1
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию Сбивается пинг

Нужен так называемый мониторинг хостов в локальной сети. Работаю в Delphi 7 с подключенной synapse, откуда беру процедуру пинга(прилагаю проект и synapse).
Код:
unit Unit1;

interface

uses
  Windows, Messages, Classes, Forms,
  PingSend, IPUtils, StrUtils, Controls, StdCtrls;

const PING_RES=WM_USER + 1000;

type
  TForm1 = class(TForm)
    GroupBox2: TGroupBox;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    RadioButton6: TRadioButton;
    RadioButton7: TRadioButton;
    RadioButton8: TRadioButton;
    RadioButton9: TRadioButton;
    RadioButton10: TRadioButton;
    RadioButton11: TRadioButton;
    RadioButton12: TRadioButton;
    RadioButton13: TRadioButton;
    RadioButton14: TRadioButton;
    RadioButton15: TRadioButton;
    RadioButton16: TRadioButton;
    RadioButton17: TRadioButton;
    RadioButton18: TRadioButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private
    procedure OnPingMessage(var msg: TMessage); message PING_RES;
  end;

    procedure PingBegin;
    procedure PingEnd;

type
     PPingResult = ^TPingResult;
     TPingResult = Record
                     IPAdress:String;
                     Exists:Boolean;
                   end;

type
  TPingThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  public
    PingResult:TPingResult;
    Ready:Boolean;
    constructor Create(Ping:TPingResult);
  end;

var
  Form1: TForm1;
  pingstop:boolean;
  ThreadArray:Array of TPingThread;
  ThreadsComplete:Boolean;
  Ping:Array of TPingResult;
  PingCount:integer;


implementation


{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  PingBegin;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PingEnd;
end;


procedure PingBegin;
var i:integer;
begin
  pingstop:=false;
  PingCount:=18;

  // Initialize dyn. Arrays
  SetLength(Ping,PingCount);
  SetLength(ThreadArray,PingCount);

  Ping[0].IPAdress := '192.168.9.100';
  Ping[0].Exists   := false;
  Ping[1].IPAdress := '192.168.9.101';
  Ping[1].Exists   := false;
  Ping[2].IPAdress := '192.168.9.102';
  Ping[2].Exists   := false;
  Ping[3].IPAdress := '192.168.9.103';
  Ping[3].Exists   := false;
  Ping[4].IPAdress := '192.168.9.104';
  Ping[4].Exists   := false;
  Ping[5].IPAdress := '192.168.9.105';
  Ping[5].Exists   := false;
  Ping[6].IPAdress := '192.168.9.106';
  Ping[6].Exists   := false;
  Ping[7].IPAdress := '192.168.9.107';
  Ping[7].Exists   := false;
  Ping[8].IPAdress := '192.168.9.108';
  Ping[8].Exists   := false;

  Ping[9].IPAdress := '192.168.9.109';
  Ping[9].Exists   := false;
  Ping[10].IPAdress := '192.168.9.110';
  Ping[10].Exists   := false;
  Ping[11].IPAdress := '192.168.9.111';
  Ping[11].Exists   := false;
  Ping[12].IPAdress := '192.168.9.112';
  Ping[12].Exists   := false;
  Ping[13].IPAdress := '192.168.9.113';
  Ping[13].Exists   := false;
  Ping[14].IPAdress := '192.168.9.114';
  Ping[14].Exists   := false;
  Ping[15].IPAdress := '192.168.9.115';
  Ping[15].Exists   := false;
  Ping[16].IPAdress := '192.168.9.116';
  Ping[16].Exists   := false;
  Ping[17].IPAdress := '192.168.9.117';
  Ping[17].Exists   := false;

  // Create one Thread for each Ping
  for i := 0 to PingCount-1 do begin
    ThreadArray[i] := TPingThread.Create(Ping[i]);
    end;
end;


procedure PingEnd;
var
  i:integer;
begin
  pingstop:=true;
  // Wait till all threads are executed
  repeat
    ThreadsComplete := true;
    Sleep(1000);
    for i := 0 to PingCount-1 do
      if not ThreadArray[i].Ready then begin
        ThreadsComplete := false;
        break;
      end;
  until ThreadsComplete;
  // Free Threads
  for i := 0 to PingCount-1 do
    ThreadArray[i].Free;
end;


constructor TPingThread.Create(Ping:TPingResult);
begin
  PingResult.IPAdress := Ping.IPAdress;
  inherited Create(False);
end;


procedure TPingThread.Execute;
var
  Ping:TPingSend;
  pingprev,pingthis:boolean;
begin
  pingprev:=false;
  pingthis:=false;
  Ready:= false;
  Ping:= TPingSend.Create;
  Ping.Timeout := 2000;
  while pingstop=false do begin
    //try
    PingResult.Exists := Ping.Ping(PingResult.IPAdress);
    pingprev:=pingthis;
    pingthis:=PingResult.Exists;
    //except end;
    if pingthis<>pingprev then
      PostMessage(Form1.Handle,PING_RES,IPToCardinal(strtoip(PingResult.IPAdress)),integer(PingResult.Exists));
    sleep(1000);
  end;
  Ping.Free;
  Ready := true;
end;


procedure TForm1.OnPingMessage(var msg: TMessage);
var
  ip:string;
begin
    ip:=iptostr(cardinaltoip(msg.WParam));
    case ANSIIndexText( ip , ['192.168.9.100', '192.168.9.101', '192.168.9.102', '192.168.9.103',
                              '192.168.9.104', '192.168.9.105', '192.168.9.106', '192.168.9.107',
                              '192.168.9.108',

                              '192.168.9.109', '192.168.9.110', '192.168.9.111', '192.168.9.112',
                              '192.168.9.113', '192.168.9.114', '192.168.9.115', '192.168.9.116',
                              '192.168.9.117']) of

    0:Form1.RadioButton1.Enabled:=boolean(msg.LParam);
    1:Form1.RadioButton2.Enabled:=boolean(msg.LParam);
    2:Form1.RadioButton3.Enabled:=boolean(msg.LParam);
    3:Form1.RadioButton4.Enabled:=boolean(msg.LParam);
    4:Form1.RadioButton5.Enabled:=boolean(msg.LParam);
    5:Form1.RadioButton6.Enabled:=boolean(msg.LParam);
    6:Form1.RadioButton7.Enabled:=boolean(msg.LParam);
    7:Form1.RadioButton8.Enabled:=boolean(msg.LParam);
    8:Form1.RadioButton9.Enabled:=boolean(msg.LParam);

    9:Form1.RadioButton10.Enabled:=boolean(msg.LParam);
    10:Form1.RadioButton11.Enabled:=boolean(msg.LParam);
    11:Form1.RadioButton12.Enabled:=boolean(msg.LParam);
    12:Form1.RadioButton13.Enabled:=boolean(msg.LParam);
    13:Form1.RadioButton14.Enabled:=boolean(msg.LParam);
    14:Form1.RadioButton15.Enabled:=boolean(msg.LParam);
    15:Form1.RadioButton16.Enabled:=boolean(msg.LParam);
    16:Form1.RadioButton17.Enabled:=boolean(msg.LParam);
    17:Form1.RadioButton18.Enabled:=boolean(msg.LParam);
    end;
end;
Запускаю. Сначала все хорошо. Определенные радиобаттоны в enable. Потом отключаю какой-нибудь хост от сети. И начинается: радиобаттоны, хосты которых в сети, остаются в enable; а остальные начинают хаотично (вроде) включаться/выключаться (enable/disable). В чем дело?
Вложения
Тип файла: rar Ping.rar (180.0 Кб, 6 просмотров)
Тип файла: rar synapse40.rar (296.0 Кб, 8 просмотров)
Programmer0 вне форума Ответить с цитированием
Старый 01.04.2016, 08:16   #2
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию

Прошу помощи. Подскажите хоть, куда копать.
Programmer0 вне форума Ответить с цитированием
Старый 01.04.2016, 16:28   #3
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию

Поменял в procedure TPingThread.Execute строку sleep(1000) на sleep(10000). Вроде стало нормально. Почему?
Programmer0 вне форума Ответить с цитированием
Старый 01.04.2016, 17:09   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Читаем rfc https://tools.ietf.org/html/rfc777
Маршрутизатор вам может вернуть ответ.
Вы проверяете, что ответ пришел. Но не проверяете какой. Используйте ReplyError. http://synapse.ararat.cz/doc/help/pi...tml#ReplyError
Использовать Sleep в данном коде некоректно. Он убивает всю программу, а не поток. Используйте другой таймер с waitefor...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 04.04.2016, 09:10   #5
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Читаем rfc https://tools.ietf.org/html/rfc777
Маршрутизатор вам может вернуть ответ.
Вы проверяете, что ответ пришел. Но не проверяете какой. Используйте ReplyError. http://synapse.ararat.cz/doc/help/pi...tml#ReplyError
Спасибо. А объясните, почему:
Цитата:
Использовать Sleep в данном коде некоректно. Он убивает всю программу, а не поток. Используйте другой таймер с waitefor...
? Программа не висит. А sleep-ом я приостанавливаю потоки, чтобы пинги не шли постоянно.
Programmer0 вне форума Ответить с цитированием
Старый 04.04.2016, 11:12   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

код - пипец. как мне это развидеть?



а радиобатоны зачем?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.04.2016, 11:15   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

http://www.delphimaster.net/view/2-1153197410/40-80
http://read.pudn.com/downloads79/sou...read.pas__.htm
https://searchcode.com/codesearch/view/13374086/

энд мэни мо
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.04.2016, 13:28   #8
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
код - пипец. как мне это развидеть?
Я не отрицаю. Но вы, пожалуйста, объясните, что не так, и как сделать лучше.Отсюда и брал. И доделывал, чтобы каждый хост пинговался постоянно.
Цитата:
а радиобатоны зачем?
Чтобы выбирать, на какой из подключенных хостов можно слать инфу.
Programmer0 вне форума Ответить с цитированием
Старый 04.04.2016, 14:06   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Чтобы выбирать, на какой из подключенных хостов можно слать инфу.
Типа, выбрать только один хост можно?
Тогда убери радиобатоны и поставь один комбобокс.

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

Да, и ещё - напиши класс-список потоков (потомок от TThreadList)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.04.2016, 14:51   #10
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Типа, выбрать только один хост можно?
Оп, не подумал. Нужна возможность выбирать несколько. Поменял на checkbox-ы.
Цитата:
А класс треда описывай в отдельном модуле и сделай его независимым от остальной программы.Да, и ещё - напиши класс-список потоков (потомок от TThreadList)
Понял. Спасибо.

Ещё бы разобраться со sleep-ом.
Programmer0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пинг до сайта mogo Общие вопросы Delphi 8 15.02.2014 17:49
Пинг-понг mixon-21 JavaScript, Ajax 1 19.01.2014 12:57
Неустойчивый пинг WorldMaster Windows 6 28.04.2013 23:19
Сбивается нумерация страницы в MO WORD DarkingBluth Microsoft Office Word 1 27.02.2013 17:55
Определить пинг Shouldercannon Общие вопросы Delphi 10 26.05.2011 21:32