Перейти до вмісту

Пінгування комп"ютерів


Повідомлень в темі: 4

#1 VadMat

    Ледар

  • Користувачі
  • PipPip
  • 12 повідомлень
  • Місто:м.Івано-Франківськ

Відправлено 06.07.2007 – 11:34

  • 4
Ось така проблемка:
Є дві мережі, з"єднані через VPN.
В С++ Білдері є така компонента IdIcmpClient, якою я пінгую комп"юкери в другій мережі(всі по порядку).
Якщо друга мережа недоступна - програма починає нагло пригальмовувати.

Я думаю в мене проблема з алгоритмом:
Є два масиви IP комп"ютерів другої мережі.

Цикл по таймеру через кожні 2сек.
{
Пінгую по порядку:
Якщо немає відповіді - IP комп"ютера видаляється з першого масиву(щоб не пінгувати виключені
компи), якщо є відповідь - мережа доступна.
Якщо немає відповіді від 6-ти(а це 6 секунд гальмування), то мережа недоступна.

Якщо перший масив IP порожній - заповнюю його з другого масиву, і все по новій...
}

Не подобається мені цей алгоритм, але придумати краще не можу.
Підкажіть варіанти.

#2 КлятЫй мАскаль

    Писар

  • Користувачі
  • PipPipPipPipPipPipPipPip
  • 428 повідомлень
  • Стать:Чоловік
  • Місто:Київ

Відправлено 06.07.2007 – 12:11

Перегляд дописуVadMat (6.07.2007 12:34) писав:

Підкажіть варіанти.

Роботу з мережою проводити у додатковій нитці (thread). І не забувати про синхрозування з головною ниткою.
  • 0

#3 VadMat

    Ледар

  • Користувачі
  • PipPip
  • 12 повідомлень
  • Місто:м.Івано-Франківськ

Відправлено 09.07.2007 – 09:08

Ніколи не працював з нитками.
Може компонент, що пінгує треба створювати в середині нитки?
Тоді як, адже TThread прямий нащадок TObject.
І в допомогах, і в прикладах нічого подібного не заходжу.
А в книжках дуже скупо описується цей компонент і його можливості.

I need help!
  • 0

#4 КлятЫй мАскаль

    Писар

  • Користувачі
  • PipPipPipPipPipPipPipPip
  • 428 повідомлень
  • Стать:Чоловік
  • Місто:Київ

Відправлено 10.07.2007 – 02:04

Перегляд дописуVadMat (9.07.2007 10:08) писав:

Може компонент, що пінгує треба створювати в середині нитки?
Створювати у конструкторі, руйнувати у деструкторі. Змінну-компонент зробити приватним полем у своєму нащадку TThread. Робота з мережою — у своему методі Execute. Сінхрозування з головним потоком — через Synchronize.
Можу накалякати зразок на мові Borland Delphi, сподіваюсь, він буде корисним.
Схематично так.

type
  // Класс-нащадок TThread
  TPingThread = class (TThread)
  private
	FPinger: TPinger; // власне компонент-попінгуй 8)
	FIp: string;
	FOnSuccess: TNotifyEvent;
	procedure DoOnSuccess;
  protected
	procedure Execute; override;
  public
	constructor Create(CreateSuspended: Boolean);
	destructor Destroy; override;
	property OnSucces: TNotifyEvent read FOnSuccess write FOnSuccess;
	property Ip: string read FIp write FIp;
  end;
...
constructor TPingThread.Create(CreateSuspended: Boolean);
begin
  inherited Create (CreateSuspended);
  FPinger := TPinger.Create;
end;

destructor TPingThread.Destroy;
begin
  FPinger.Free;
  inherited;
end;

procedure TPingThread.DoOnSuccess;
begin
  if Assigned(FOnSuccess) then
	FOnSuccess (Self)
end;

// Цей метод буде визваний автоматично, коли нитка «стартує»
procedure TPingThread.Execute;
begin
  if FPinger.Ping (FIp) then
	Synchronize(DoOnSuccess);
end;


Застосування:

  with TPingThread.Create (True) do
  begin
	FreeOnTerminate := True;
	OnSuccess := OnPingSuccess; // назначаємо наш обробник події, буде викликатися  у контексті головної нитки (див. вишче)
	Resume;
  end;

Якщо компонент-попінгуй верне True із свого метода Ping, то буде визваний наш обробник події OnSuccess (у контексті головної нитки).
Усе :)

П.С. Вигадиний компонент TPinger зміни на TIdIcmpClient і проводь роботу з ним відповідним чином.

Повідомлення відредагував КлятЫй мАскаль: 10.07.2007 – 02:05

  • 0

#5 VadMat

    Ледар

  • Користувачі
  • PipPip
  • 12 повідомлень
  • Місто:м.Івано-Франківськ

Відправлено 18.07.2007 – 10:34

Велике спасибі: я трохи навчився працювати з нитками. Зробив правда трохи інакше, бо мені потрібно було тільки синхронізувати одну змінну, але суть зрозумів :P .
  • 0



Кількість користувачів, що читають цю тему: 1

0 користувачів, 1 гостей, 0 анонімних