Плагин lists.spf [15/08/2013 21:40]

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

Плагин lists.spf [15/08/2013 21:40]

Postby VoidVolker » Sat, 19 Nov 2011, 15:56

Плагин для работы с односвязными глобальными и локальными списками. Изначально было как небольшое расширение на базе стандартного механизма для работы со списками, добавляющее возможность работать с глобальными списками. После полной переработки от этого расширения осталось лишь несколько названий слов. В результате получился полноценный плагин, использующий стандартный механизм итератора. Предоставляет намного более удобный и гибкий интерфейс для работы со списками, по сравнению со стандартным кроновским DoList.
Внимание! Для работы этого плагина необходимо предварительно подключить плагин Autostrings.spf или strings.spf. Сначала подключаем автостроки/строки и только потом списки в nncron.ini:
Code: Select all
INCLUDE "plugins\autostrings.spf"
INCLUDE "plugins\lists.spf"

Code: Select all
INCLUDE "plugins\strings.spf"
INCLUDE "plugins\lists.spf"


http://www.nncron.ru/download/plugins/vv/lists.spf

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

Re: Плагин lists.spf

Postby AlikasS » Sun, 20 Nov 2011, 15:36

VoidVolker wrote:Плагин для работы с односвязными глобальными и локальными списками. .....
Предложения, замечания?

может было проще рассказать про два слова в nncron
- GLOBAL ( использовать Heap основного (главного) потока)
- LOCAL (вернуться в локальный (поточный) Heap)
и сделать дополнительные слова для работы со списком
p.s. но сама реализация поучительна для изучающих крон и форт,
если она работает (сам не пробовал)
Last edited by AlikasS on Sun, 20 Nov 2011, 15:53, edited 1 time in total.
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Плагин lists.spf

Postby VoidVolker » Sun, 20 Nov 2011, 15:51

AlikasS wrote:GLOBAL ( использовать Heap основного (главного)) потокаLOCAL вернуться в локальный (поточный) Heap

О, а вот этого не знал, сейчас посмотрю. Т.е. говорим GLOBAL и далее у нас ALLOCATE работает как GLOBAL-ALLOCATE? Удобно конечно, но не в данном случае: я как раз хотел избавить программиста от необходимости контроля какая память используется в списке. Т.е. если убрать менеджмент памятью, и использовать GLOBAL и LOCAL, тогда необходимо будет каждый раз не только указывать, какую память использовать, но и помнить, так же в этом случае очень легко перепутать отдельные элементы списка - они могут стать как локальными так и глобальными.
AlikasS wrote:и сделать дополнительные слова для работы со стандартными словами работы со списком

Пройденный этап уже.
VoidVolker wrote:Изначально было как небольшое расширение на базе стандартного механизма для работы со списками

AlikasS wrote:но сама реализация поучительна для изучающих крон и форт,
если она работает (сам не пробовал)

Конечно работает.

Пару слов о создании и уничтожении списков. Дело в том, что слова LIST: и GLOBAL-LIST: выделяют память для заголовка списка в памяти крона, по ALLOT, поэтому такой список можно создать и освободить, но нельзя уничтожить(словом LIST-DEL). А вот если например надо динамически создавать и уничтожать списки, то для этого и есть слова LIST и GLOBAL-LIST - они выделяют память для нулевого элемента через ALLOCATE и GLOBAL-ALLOCATE, что и позволяет освобождать память, занятую заголовком. Например для создания деревьев или других связанных структур.

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

Re: Плагин lists.spf

Postby AlikasS » Sun, 20 Nov 2011, 16:27

VoidVolker wrote:Есть ли необходимость работы со строками в списках?

а что там нового будет? az строки рулят
Code: Select all
#( пример_работа_со_списком
NoActive
VARIABLE f-list \ в списке будут хранится адреса az строк, которые содержат найденные имена файлов
0 VALUE TTTT
: f-action NodeValue ASCIIZ> MsgBox
\ получение значение элемента списка - адреса az строки из списка, преобразование в au строку
\ вывод au строки - имени файла
;
: f-see
\ получение значения элемента списка - адреса az строки из списка, преобразование в au строку
\ и сравнение с найденным файлом
NodeValue ASCIIZ> FOUND-FILENAME COMPARE 0=
IF
TRUE TO TTTT
ELSE
FALSE TO TTTT
THEN
;
: f-free NodeValue FREE DROP
\ получение значения элемента списка - адреса az строки из списка,
\ высвобождение зарезервированной памяти по этому адресу
;
Action:
FOR-FILES: "%ModuleDirName%*.tab*"
IS-DIR? 0=
IF
   ['] f-see f-list DoList \ в данном случае вроде не нужная проверка на совпадение, но  вдруг в др.случаях понадобится
   TTTT 0= IF
    \ если файла нет в списке, внесение адреса az строки с его именем в список
   FOUND-FILENAME S>ZALLOC f-list AddNode
   THEN
THEN
;FOR-FILES

 f-list @
 IF
\ список не пустой
    ['] f-action f-list DoList \ вывод занесенных значений
    ['] f-free f-list DoList \ очистка памяти отведенной под az строки
    f-list FreeList \ очистка списка
 THEN
)#
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Плагин lists.spf

Postby VoidVolker » Sun, 20 Nov 2011, 16:49

AlikasS wrote:
VoidVolker wrote:Есть ли необходимость работы со строками в списках?

а что там нового будет? az строки рулят
Code: Select all
#( пример_работа_со_списком
NoActive
VARIABLE f-list \ в списке будут хранится адреса az строк, которые содержат найденные имена файлов
0 VALUE TTTT
: f-action NodeValue ASCIIZ> MsgBox
\ получение значение элемента списка - адреса az строки из списка, преобразование в au строку
\ вывод au строки - имени файла
;
: f-see
\ получение значения элемента списка - адреса az строки из списка, преобразование в au строку
\ и сравнение с найденным файлом
NodeValue ASCIIZ> FOUND-FILENAME COMPARE 0=
IF
TRUE TO TTTT
ELSE
FALSE TO TTTT
THEN
;
: f-free NodeValue FREE DROP
\ получение значения элемента списка - адреса az строки из списка,
\ высвобождение зарезервированной памяти по этому адресу
;
Action:
FOR-FILES: "%ModuleDirName%*.tab*"
IS-DIR? 0=
IF
   ['] f-see f-list DoList \ в данном случае вроде не нужная проверка на совпадение, но  вдруг в др.случаях понадобится
   TTTT 0= IF
    \ если файла нет в списке, внесение адреса az строки с его именем в список
   FOUND-FILENAME S>ZALLOC f-list AddNode
   THEN
THEN
;FOR-FILES

 f-list @
 IF
\ список не пустой
    ['] f-action f-list DoList \ вывод занесенных значений
    ['] f-free f-list DoList \ очистка памяти отведенной под az строки
    f-list FreeList \ очистка списка
 THEN
)#

А вот например так:
Code: Select all
#( пример_работа_со_списком
NoActive
SLIST: tabs
Action:
FOR-FILES: "%ModuleDirName%*.tab*"
  FOUND-FILENAME tabs!
;FOR-FILES

tabs( NSTRING MsgBox )tabs

tabs FREE-SLIST  \ А это даже и не обязательно - при закрытии потока вся память автоматически освободится
)#
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby AlikasS » Sun, 20 Nov 2011, 17:20

good +100
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Плагин lists.spf

Postby VoidVolker » Sun, 20 Nov 2011, 19:57

Ап! Добавлена поддержка строк. Теперь списки могут быть и строковыми. При добавлении строки в список для нее автоматически выделяется память, а при очистке списка - память, занятая строкой также автоматически освобождается. Причем, без изменения синтаксиса: одни и те же слова работают и с числами и со строками. Единственный минус - список может быть либо только числовым, либо только строковым. Для добавления поддержки хранения в одном списке и строк и чисел, необходимо будет разделить синтаксис на числа и строки, а также ввести в элемент списка еще один байт с флагом - строка там или число. Либо, сделать один формат элемента списка - две ячейки, если во второй ячейке ноль - в элементе число, иначе - это строка, Да, наверно так и сделаю.
Внимание! Строки на данный момент в статусе бета-версии. Просто не успел все тщательно протестировать, допускаю возможность наличия багов.
Code: Select all
#( пример_работа_со_списком
NoActive
STRING-LIST: tabs
Action:
FOR-FILES: "%ModuleDirName%*.tab*"
  FOUND-FILENAME tabs!
;FOR-FILES

tabs( NVAL MsgBox )tabs

tabs FREE-LIST  \ А это даже и не обязательно - при закрытии потока вся память автоматически освободится
)#
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Aveiro » Mon, 21 Nov 2011, 06:01

Умные ребята подскажите для чего данный плагин ? :oops:
Он для текста или списки другого рода имелись ввиду ?
Дайте примерчик для исползования....
Спасибки.
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: Плагин lists.spf

Postby VoidVolker » Mon, 21 Nov 2011, 17:04

Aveiro wrote:Умные ребята подскажите для чего данный плагин ? Он для текста или списки другого рода имелись ввиду ?

Можно использовать и для текста: например можно сделать список файлов или строк файла и иметь к ним удобный интерфейс.
Более продвинутая замена стандартным спискам. Пример на список файлов смотри выше, аналогично делается список из строк файла - с использованием READ-BY-LINE. Можно создавать списки из например имен пользователей или там разрешенных к запуску процессов.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Mon, 21 Nov 2011, 22:06

при загрузке плагина ннкрон ругается на эту строчку:
Code: Select all
      >R 0 -ROT R> LIST(  \ 0 a u
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Mon, 21 Nov 2011, 22:20

Code: Select all
: -ROT ROT ROT ;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby VoidVolker » Wed, 23 Nov 2011, 17:48

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

Re: Плагин lists.spf

Postby Morituruz » Thu, 24 Nov 2011, 15:27

VoidVolker wrote:: -ROT ROT ROT ;

в первый то пост это добавить не хотите?
VoidVolker wrote:Кто-нибудь заюзал? Как оно?

я переделываю одну задачу, вроде работает, но не могу судить, насколько удобнее чем с обычными списками. Разве что, если верить вам, f-free прописывать не надо.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Thu, 24 Nov 2011, 16:48

Moriturus wrote: Разве что, если верить вам, f-free прописывать не надо.

Вообще-то для очистки списка есть FREE-LIST, просто например если задача работает с небольшим объемом данных и быстро завершает работу(секунды), то нет особой надобности в освобождении памяти, т.к. винда все равно автоматически освободит после уничтожения потока, всю занятую им память. Но вообще, все таки рекомендуется принудительно очищать список после того, как он перестал быть нужным.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Fri, 25 Nov 2011, 22:42

Зацените:
Code: Select all

#( CLASSIC-TASK-#-Ping_by_list
SingleInstance
NoLog
HyperActive
Time: */5  * * * * *
Rule: ONLINE? ;
STRING-LIST: hosts
CREATE bln 256 ALLOT
\ слова для получения соотв. значений:
: host_ip S" ip" INI-GET-VALUE ;
: host_loss S" loss" INI-GET-VALUE S>NUM ;
: host_time S" time" INI-GET-VALUE S>NUM ;
\ флаг индикации проблем:
VARIABLE bad?

Action:
S" .\ping.ini" INI-FILENAME
\ секции:
S" DNS" hosts!
S" Google" hosts!
S" region18" hosts!
S" norm" hosts!

S" " bln PLACE
\ заполняем строку названиями хостов:
hosts(
   CRLF NVAL S+ S" : 0 ms, 0 %" S+ bln +PLACE
)hosts

\ отрезаем первый перенос:
bln COUNT 2 /STRING bln PLACE

32516 ping_tray_icon !

\ вешаем иконочку
S" %bln COUNT%" EVAL-SUBST ping_tray_icon @ 0 LoadIconA ADD-TI ping_icon_id !

BEGIN
   bad? OFF
   hosts(
      NVAL INI-SECTION
      0 TO ping_loss
      0 TO ping_time
      \ подставляем знак вопроса в пингуемое в данный момент соединение:
      bln COUNT S" /%NVAL%.+%PERCENT%(\r\n)|($)/i" EVAL-SUBST RE-ALL
         bln S" %bln COUNT%" EVAL-SUBST $0 S" ? " $0 S+ StringReplace2
      ;RE-ALL
      bln COUNT ping_tray_icon @ 0 LoadIconA ping_icon_id @ MODIFY-TI
      \ пингуем
      ping_count 0 DO
         S" %host_ip%" EVAL-SUBST PING2 ping_time + TO ping_time
         ping_timeout PAUSE
      LOOP
      \ пересчитываем потери и время в расчёте на кол-во пингов:
      ping_time ping_count / TO ping_time
      ping_loss 100 * ping_count / TO ping_loss
      \ записываем в лог:
      FILE-APPEND: "g:\%NVAL%_ping.log" "%YY%.%MM%.%DD% %hh%:%mm%:%ss% %NVAL%: %ping_time% ms, %ping_loss% %PERCENT%%crlf%"
      \ обновляем значение пинга и потерь:
      bln COUNT S" /%NVAL%.+/i" EVAL-SUBST RE-ALL
         bln S" %bln COUNT%" EVAL-SUBST $0 S" %NVAL%: %ping_time% ms, %ping_loss% %PERCENT%" EVAL-SUBST StringReplace2
      ;RE-ALL
      \ убираем знак вопроса:
      bln S" %bln COUNT%" EVAL-SUBST S" ? " S" " StringReplace2
      bln COUNT ping_tray_icon @ 0 LoadIconA ping_icon_id @ MODIFY-TI
   
      \ сравниваем потери и пинг с допустимыми:
      host_time ping_time <
      host_loss ping_loss <
      OR
      IF
         bad? ON
      THEN
   )hosts
   bad? @
   IF
      32515 ping_tray_icon !
   ELSE
      32516 ping_tray_icon !
   THEN
   bln COUNT ping_tray_icon @ 0 LoadIconA ping_icon_id @ MODIFY-TI
   ASSUMED-NEXT-TIME
   IF
      FT-CUR FT- FT>MS D>S PAUSE
   THEN
ONLINE? 0=
UNTIL
)#

User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests