Вверх ↑
Этот топик читают: Гость
Ответов: 3
Рейтинг: 1
#1: 2012-02-11 16:02:49 ЛС | профиль | цитата
Доброго всем времени суток!

Прошу помощи в упрощении (улучшении ) схемы.

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

Вкратце в схеме:

code_26822.txt

В папке с программой должен лежать settings.ini, с содержимым вида: Имя=127.0.0.1;
Задав необходимый интервал таймера, происходит поочередный (закольцованный) Ping IP-адресов по списку из settings.ini (после окончания проверки списка и начала проверки по-новой происходит задержка равная 2*интервал - как-то можно этого избежать?).

Если Ping на один из адресов не проходит, происходит запись сообщения в лог, этот адрес попадает в другой список (из первого списка удаляется), где отдельно пингуется, до восстановления, запись о восстановлении добавляется в лог и адрес уходит обратно в список, взятый из settings.ini. (Интервалы для пинга «потерянного» адреса также задаются).

Лог записывается в папке с программой в файл log.txt

Сам файл с настройками (settings.ini) должен быть неизменен, запись в него, осуществляться не должна.

Спасибо. Буду благодарен за помощь.

карма: 0

0
файлы: 1code_26822.txt [8.1KB] [296]
Ответов: 273
Рейтинг: 29
#2: 2012-02-11 19:56:41 ЛС | профиль | цитата
Вместо надписей для интервалов лучше использовать поля ввода - вдруг нужно будет указать бОльшие интервалы? Не щелкать же счетчиком до тысячи. Ну это как тебе удобнее

При загрузке ini сканируются все секции, и в список попадает также содержимое всех секций. Для списка адресов это приемлемо, но если захочешь там хранить настройки - они тоже попадут в список и будут пинговаться
Стоит загружать адреса только из секции адресов.

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

Когда переносишь адреса из первого списка во второй, зачем-то добавляешь еще одну строку, содержащую еще одну копию списка (мусор по своей сути).

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

Непонятно, зачем все эти переносы из списка в список.

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

Дошел до сердца алгоритма - перебор адресов.
Твоя прога работает так: загружает второй список данными из первого, начинает по очереди удалять элементы из второго списка, попутно пингуя их.
Слишком много лишних операций. Используй массивы - и память не придется тусовать за зря.

Потенциальный косяк: Время опроса 3 секунды, таймаут пинга 100мс, список из 50 адресов, все в дауне. Что будет?

После определения ошибки, при неудаче пинга, происходит поиск в settings.ini количества принятых байт. Смысл?
Вероятно должен был искать имя по пингу? Так вот - ищет не имя, а количество байт. Смотри приоритеты данных в хэлпе.
Также этот шаг не очень оптимален. Зачем искать что-то на диске, если ты же уже загрузил имена в отдельный список.
Используй массивы. Грузи имена в один массив, а адреса в другой. Зная индекс адреса, моментально получишь имя.
Заметь - никакой лишней нагрузки на память, проц и диск, а значит больше ресурсов остается свободными для других косяков

При нормальной работе процедура обработки лога несколько раз в секунду загружает и выгружает один и тот же файл, если кто-нибудь в дауне. Можно было сделать и экономичнее.
Да и лог короткий - всего 100 строк. Значит он реально не используется, т.к. будет забит полностью за несколько циклов пинга, т.е. в пределах минуты.
Значит по этому логу не ведется какой-либо учет, и он используется только как способ узнать, кто из списка был в дауне на момент закрытия программы. Так?

Потенциальный косяк - бесконечный рост лога в памяти во время работы программы. Список строк лога все растет и растет, но не убывает.

После того, как лог был записан, и адрес был найден, происходит самоочистка первого списка.
Несколько непонятен этот шаг. Вероятно ошибка?
Если нет, тогда и логики нет: список проверки постепенно будет сокращаться, пока не станет пустым, и проверять будет нечего. Какая-же это циклическая проверка?
Одновременно здесь зарыт второй косяк: если кто-то упадет и поднимется, ты этого уже не увидишь, ведь его адрес навсегда исчезнет из списка проверки.

Странная логика работы проверки упавших адресов - если кто-нибудь один упал, вся программа виснет, пытаясь до него достучаться. Т.е. нарушается цикл проверки остальных адресов. Хотя теперь понятен смысл самоочистки.
С массивом будет проще - делаешь отдельный массив, где хранишь состояние адреса. В таком случае не только сохраняется связь массивов по индексу с именем и адресом, но и мониторинг упавшего адреса идет в общем цикле, не прерывая программу.

В общем тут нужно не улучшать, а переделывать с нуля всю логику.
карма: 0

1
Голосовали:bibikey
Ответов: 16884
Рейтинг: 1239
#3: 2012-02-12 00:37:25 ЛС | профиль | цитата
bibikey писал(а):
Прошу помощи в упрощении (улучшении ) схемы.

zam.png
Шесть компонент в квадрате справа запросто меняются на один StrList.
А если по-честному, то логика программы запутана до предела.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1zam.png [6.8KB] [356]
Ответов: 3
Рейтинг: 1
#4: 2012-02-12 20:18:01 ЛС | профиль | цитата
Tad, спасибо.

tomas:

Я виноват, не уточнил - смысл в том, что, "упавший" пинг - это инцидент, в идеале всё пингумое всегда должно быть в сети...
Программа всегда запущенна, перезапускается она, только тогда, когда требуется добавить что-то в список ini.
Соответственно, в лог уходит только то, что не пингуется - 1"0""0" записей в лог, впринципе достаточно для такого условия, при достижении 1"0""0" записей удаляется более старая запись.
Сам лог HiLightMemo - добавил просто для контроля, возможно далее от него откажусь.

При загрузке ini сканируются все секции, и в список попадает также содержимое всех секций. Для списка адресов это приемлемо, но если захочешь там хранить настройки - они тоже попадут в список и будут пинговаться
Стоит загружать адреса только из секции адресов.

Я тоже так подумал, но у меня почему-то возникает ошибка при запуске ntdll.dll - поэтому пришлось обратится к сканированию всех секций.

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

В этом случае перебора не происходит, необходимо передавать именно "0".

Если нет, тогда и логики нет: список проверки постепенно будет сокращаться, пока не станет пустым, и проверять будет нечего. Какая-же это циклическая проверка?
Одновременно здесь зарыт второй косяк: если кто-то упадет и поднимется, ты этого уже не увидишь, ведь его адрес навсегда исчезнет из списка проверки.

Да нет, адрес возвращется в 1й список, после восстановления...

Схема это просто набросок, всё сказанное очень полезно, спасибо.

С массивами пока работать не приходилось , поэтому такая реализация...
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#5: 2012-02-13 01:23:06 ЛС | профиль | цитата
tomas писал(а):
Непонятно, зачем после таймера идет вызов события по индексу. Стоит убрать
Не надо убирать. Единственное на всю схему отличное решение. ИМХО.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 273
Рейтинг: 29
#6: 2012-02-13 02:07:16 ЛС | профиль | цитата
Tad писал(а):
Не надо убирать. Единственное на всю схему отличное решение. ИМХО.
А в чем преимущество перед DoData?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#7: 2012-02-13 16:15:52 ЛС | профиль | цитата
Результирующие коды короче на 200 байт.
Мелочь, но приятно.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)