Вывести информацию через HINT.

Обсуждение программ nnCron и nnCron LITE

Вывести информацию через HINT.

Postby Halfer » Wed, 29 Aug 2007, 06:47

Задача такая. Нужно отслеживать наличие связи с несколькими хостами и в конечном виде, при разрыве коннекта, выдавать результат на экран монитора. Решение задачи вижу так:

Делаем цикл, в котором будут пинговаться нужные хосты. При отсутствии связи, необходимо записать в массив параметр "имя хоста - нет связи!". По окончанию проверки, и при наличии хоть одного значения в массиве (т.е. хоть один хост недоступен) - выдать сообщение через падсказку HINT. Потом снова прыгаем в начало проверки и процесс зацикливается. Само собой что статус связи будет меняться со временем, и соответственно данные массива тоже будут меняться, поэтому просто изменяемую переменную создать не получиться. Как Вы видите решение такого вопроса?

З.Ы. Понимаю, что вопрос работы с массивами описан в доках, но всегда прощё разбираться на готовом примере :-)

З.Ы.Ы. Немного пересмотрел вероятное решение задачи. После того как всё проверено, и в массиве есть данные о недоступных хостах, нужно тупо сплюсовать все строки массива в переменную и выдать её значение через HINT. Как такое можно реализовать в програмном коде?
Last edited by Halfer on Sun, 16 Sep 2007, 12:21, edited 3 times in total.
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Postby Ilya » Thu, 30 Aug 2007, 13:05

Моно попробовать так:
Code: Select all
#( ping-host
CREATE hlist S" localhost" SZ", S" host1" SZ", S" host2" SZ",  \ список хостов
CREATE buf 250 ALLOT \  КОРРЕКТ !
VARIABLE badhost
Action:
0 badhost !
hlist
3 0 DO \ ! первое число должно быть <= кол-ва хостов в списке
ASCIIZ> 2DUP \ Получаем имя хоста из списка
3 PING 0= IF badhost 1+! THEN  \ Пингуем его 3-и раза, если пинга нет, то увеличиваем счётчик плохих хостов на 1-цу
+ 1+ \ чтобы выбрать следующий хост из списка
LOOP
DROP
S" Хостов не пингуется: " buf ZPLACE \ КОРРЕКТ !
badhost @ N>S buf +ZPLACE buf ASCIIZ>  \ форматируем строку для вывода в HINT
HINT
)#
Last edited by Ilya on Thu, 30 Aug 2007, 13:38, edited 1 time in total.
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Postby Halfer » Thu, 30 Aug 2007, 13:18

Ilya wrote:Моно попробовать так:
Code: Select all
#( ping-host
CREATE hlist S" localhost" SZ", S" host1" SZ", S" host2" SZ",  \ список хостов
CREATE buf S" Хостов не пингуется: " SZ", 10 ALLOT
VARIABLE badhost
NoActive
Action:
0 badhost !
hlist
3 0 DO \ ! первое число должно быть <= кол-ва хостов в списке
ASCIIZ> 2DUP 3 PING 0= IF badhost 1+! THEN \ CR TYPE
+ 1+
LOOP
DROP
badhost @ N>S buf +ZPLACE buf ASCIIZ> HINT
)#


а мона теперь каждую строчку прокомментировать! :-) Начал искать через поиск слова, но некоторые не нашёл :-( Логику работы скрипта хочется понять!
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Postby Ilya » Thu, 30 Aug 2007, 13:41

В предыдущем посте - поправил скрипт и добавил комментарии!
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Postby AlikasS » Fri, 31 Aug 2007, 04:29

чуть добавлено:
Code: Select all
#( ping-host
\ NoActive
CREATE hlist S" localhost" SZ", S" 192.168.0.201" SZ", S" host2" SZ",  \ список хостов
CREATE buf 250 ALLOT \  КОРРЕКТ !
VARIABLE badhost
CREATE test_arr 256 ALLOT \ будет список хостов без пинга
Action:
S" " test_arr ZPLACE
0 badhost !
hlist
3 0 DO \ ! первое число должно быть <= кол-ва хостов в списке
ASCIIZ> 2DUP 2DUP \ Получаем имя хоста из списка
3 PING 0=    \ Пингуем его 3-и раза, если пинга нет, то увеличиваем счётчик плохих хостов на 1-цу
IF
badhost 1+!
\ -- на стеке имя хоста
   test_arr ASCIIZ>
   IF \ длина не равна нулю следовательно уже что-то писалось
   \ на стеке имя хоста и адрес переменной
   DUP
   crlf ROT +ZPLACE \ перевод строки
    +ZPLACE \ занесение имени хоста
   ELSE
   \ на стеке имя хоста и адрес переменной
   ZPLACE
   THEN
ELSE
2DROP \ убираем имя хоста, который пингуется
\ --
THEN
+ 1+ \ чтобы выбрать следующий хост из списка
LOOP
DROP
S" Хостов не пингуется: " buf ZPLACE \ КОРРЕКТ !
badhost @ N>S buf +ZPLACE   \ форматируем строку для вывода в HINT
test_arr ASCIIZ> ?DUP IF crlf buf +ZPLACE buf +ZPLACE ELSE DROP THEN \ добавлено
buf ASCIIZ>
HINT
)#
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Postby Halfer » Fri, 31 Aug 2007, 09:35

Тяжело осмыслить такой код! Можно как-то упростить написание скрипта, например, используя не постфиксное написание, а обычное? Типа:

пингуем первый хост
если недоступен, то пишем имя хоста в массив

пингуем второй хост
если недоступен, то пишем имя хоста в массив

пингуем третий хост
если недоступен, то пишем имя хоста в массив

и т.д.

потом проверяем есть ли записи в массиве
если есть, то суммируем их и присваиваем переменной

если переменная имеет значение не равное 0, то выводим её значение через HINT.

Можно написать таким образом?
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Postby Ilya » Fri, 31 Aug 2007, 10:46

Halfer wrote:Тяжело осмыслить такой код! Можно как-то упростить написание скрипта, например, используя не постфиксное написание, а обычное? Типа:

пингуем первый хост
если недоступен, то пишем имя хоста в массив

пингуем второй хост
если недоступен, то пишем имя хоста в массив

пингуем третий хост
если недоступен, то пишем имя хоста в массив

и т.д.

потом проверяем есть ли записи в массиве
если есть, то суммируем их и присваиваем переменной

если переменная имеет значение не равное 0, то выводим её значение через HINT.

Можно написать таким образом?

Ключевое слово: а нафига тебе массив? :D
Надеюсь что так более наглядно?
Code: Select all
#( ping-host
NoActive
VARIABLE badhost
CREATE buf 250 ALLOT

: myping 3 PING 0= IF badhost 1+! THEN ; \ Определяем "новое" слово PING
Action:
0 badhost !
S" www.nncron.ru" myping
S" www.forth.org.ru" myping
S" www.badhost.ru" myping
badhost @ IF
S" Хостов не пингуется: " buf ZPLACE
badhost @ N>S buf +ZPLACE   \ форматируем строку для вывода в HINT
buf ASCIIZ>
HINT
THEN
)#

ЗЫ Поздно заметил, что тов. AlikasS расширил скрипт. Если надо выводить в HINT-е и имена "плохих" сайтов, то можно усложнить скрипт.
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Postby Halfer » Fri, 31 Aug 2007, 12:51

не дорос я, видимо, до таких скриптов.. нифига не понимаю! Буду учиться на простых задачах, эта пока сложновата для понимания.
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Postby Halfer » Sun, 16 Sep 2007, 12:09

продолжаем обсуждение :-)
Почитал в доках про массивы и понял, что изначально совсем не правильно представлял их структуру в форте. Раньше сталкивался с использованием массивов в JavaScript и PHP, поэтому изначально неправильно поставил точку отсчёта для решения задачи
.. упростим задачу. Необходимо реализовать индикацию связи через HINT для каждого хоста отдельно. Это просто, но как быть если нужно будет убрать определённую подсказку, ведь HINT-OFF убирает последнюю запись? Можно как-то при создании окошка через HINT, получать идентификатор окна? Пример:

начало цикла
пингуем первый хост
если связи нет выводим через HINT сообщение "с хостом 1 нет связи".
пингуем второй хост
если связи нет выводим через HINT сообщение "с хостом 2 нет связи".
пингуем третий хост
если связи нет выводим через HINT сообщение "с хостом 3 нет связи".
конец цикла, идём в начало

каждое сообщение будет появляться в определённом месте экрана. Но как быть, если появиться связь с первым хостом? Как убрать сообщение? Надеюсь, понятно объяснил что требуется и жду ваших советов!
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Postby VoidVolker » Sun, 16 Sep 2007, 23:56

Закидываем в файл хосты для пинга по одному на строчку. Каждую минуту они все будут пинговаться, недоступные будут висеть на мониторе в виде красного хинта десять секунд:
Code: Select all
#( ПнгиХостов
SingleInstance
: (READ-BY-LINE) { xt \ Lf Lc fEND -- }  ( a u xt -- )
    10240   \ максимальная длина строки (в символах)
    ALLOCATE THROW TO Lc
    R/O OPEN-FILE-SHARED THROW TO Lf
    BEGIN Lc 10238 Lf READ-LINE THROW WHILE
    Lc + 0 SWAP C!
    Lc ASCIIZ> xt EXECUTE \ TO fEND
    REPEAT  DROP
    Lf CLOSE-FILE DROP
    Lf FREE DROP
;

: READ-BY-LINE \ compile: ( -- )
            \  execute: ( a u --)
    POSTPONE [NONAME
; IMMEDIATE

: ;READ-BY-LINE
    POSTPONE NONAME]
    POSTPONE (READ-BY-LINE)
; IMMEDIATE

: READ-BY-LINE: eval-string,  POSTPONE READ-BY-LINE ; IMMEDIATE

: ПИНГОВАТЬ
  2DUP
  3 PING
   IF
     2DROP
   ELSE
     crlf S+ S+  \ Вот для чего пустая строка в начале таска - иначе в первой итерации будет не к чему прибавлять.
   THEN
;
Action:
S" "
READ-BY-LINE: "D:\hosts.txt"
  ПИНГОВАТЬ
;READ-BY-LINE
0 >
   IF
     0xFF0000 0xFFFFFF HINT-COLOR
     10 THINT
   ELSE 2DROP THEN
)#

P.S. Открытые и легко доступные стеки позволяют обходится без дополнительных переменных и массивов для хранения временных данных.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Вывести информацию через HINT.

Postby Halfer » Tue, 08 Jan 2008, 08:54

Я всё-таки написал свой скрипт, который отображает текущее состояние хостов :-) В конечном виде он сложен для понимания и не оптимизирован, поэтому пример приводить пока не буду. Но если кому интересно, могу скинуть..
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Вывести информацию через HINT.

Postby Halfer » Tue, 22 Jan 2008, 09:32

Подскажите, пожалуйста, ещё одно решение с использованием слова HINT. Допустим, через это слово было отображено 3 подсказки. Как я понял, чтобы обновить значение строк в этих подсказках, необходимо сначало их убрать через HINT-OFF, а потом снова отобразить. Поэтому возникает логичный вопрос. Как можно получить при создании подсказки идентификатор её окна, чтобы потом через этот идентификатор можно было закрыть только определённое окно? Так вообще возможно зделать?
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Вывести информацию через HINT.

Postby makrus » Tue, 22 Jan 2008, 13:35

Halfer
Допустим, через это слово было отображено 3 подсказки.
каждая подсказка - это процесс "tm.exe" со своим PID, при запуске запоминаешь PID и по нему же затем закрываешь соотвествующую подсказку.
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Re: Вывести информацию через HINT.

Postby Halfer » Tue, 22 Jan 2008, 13:54

makrus wrote:Halfer
Допустим, через это слово было отображено 3 подсказки.
каждая подсказка - это процесс "tm.exe" со своим PID, при запуске запоминаешь PID и по нему же затем закрываешь соотвествующую подсказку.

Ни разу не сталкивался с решением подобной задачи :-( Подскажите, плиз, какие слова использовать нужно?
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Вывести информацию через HINT.

Postby SeMa » Tue, 22 Jan 2008, 18:02

Halfer wrote:чтобы обновить значение строк в этих подсказках, необходимо сначало их убрать через HINT-OFF, а потом снова отобразить

а если их закрывать по времени? THINT
Halfer wrote:Ни разу не сталкивался с решением подобной задачи :-( Подскажите, плиз, какие слова использовать нужно?

Делал когда-то такую задачу. PID tm.exe не использовал. Щас найду - выдам.
А слова обычные: WIN-EXIST:, WIN-HWND и сохранение в переменных.
===========
Не нашел :(
В общем, примерно так:
определяем переменные:
Code: Select all
0 VALUE hint001
0 VALUE hint002
0 VALUE hint003

работет в 2-х задачах:
Code: Select all
#( Задача1
...
HINT: "сообщение1"
1000 PAUSE
S" nnCron HINT window" WIN-EXIST?
IF WIN-HWND TO hint001 THEN
...
HINT: "сообщение2"
1000 PAUSE
S" nnCron HINT window" WIN-EXIST?
IF WIN-HWND TO hint002 THEN
...
HINT: "сообщение3"
1000 PAUSE
S" nnCron HINT window" WIN-EXIST?
IF WIN-HWND TO hint003 THEN
...
)#

#( Задача2
...
WIN-CLOSE: "%hint001%"
...
WIN-CLOSE: "%hint002%"
...
WIN-CLOSE: "%hint003%"
...
)#

в одной задаче с проверкой существования окон:
Code: Select all
#( Задача3
...
FOR-WINDOWS: "nnCron HINT window"
FOUND-WINDOW WIN-EXIST?
IF WIN-HWND hint001 - 0=
   IF   WIN-CLOSE: "%hint001%" THEN
THEN
;FOR-WINDOWS
HINT: "сообщение1"
1000 PAUSE
S" nnCron HINT window" WIN-EXIST?
IF WIN-HWND TO hint001 THEN
...
FOR-WINDOWS: "nnCron HINT window"
FOUND-WINDOW WIN-EXIST?
IF WIN-HWND hint002 - 0=
   IF   WIN-CLOSE: "%hint002%" THEN
THEN
;FOR-WINDOWS
HINT: "сообщение2"
1000 PAUSE
S" nnCron HINT window" WIN-EXIST?
IF WIN-HWND TO hint002 THEN
...
FOR-WINDOWS: "nnCron HINT window"
FOUND-WINDOW WIN-EXIST?
IF WIN-HWND hint003 - 0=
   IF   WIN-CLOSE: "%hint003%" THEN
THEN
;FOR-WINDOWS
HINT: "сообщение3"
1000 PAUSE
S" nnCron HINT window" WIN-EXIST?
IF WIN-HWND TO hint003 THEN
...
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Google [Bot], Yahoo [Bot] and 2 guests