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

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

Re: Плагин lists.spf

Postby Morituruz » Wed, 04 Jan 2012, 18:29

В шапке повторения:
Code: Select all
\ LIST:   \ ( " name" -> ) \ Создать список, имя списка берется из входного потока. Для заголовка списка выделяется память из кодофайла: список можно освободить, но нельзя уничтожить.
\ GLOBAL-LIST:   \ ( " name" -> ) \ Создать глобальный список, имя списка берется из входного потока. Для заголовка списка выделяется память из кодофайла: список можно освободить, но нельзя уничтожить. Список доступен для всех потоков. При работе с такими списками рекомендуется использовать мьютексы(флаги доступа).

\ STRING-LIST:   \ ( " name" -> ) \ Создать строковый список, имя списка берется из входного потока. Для заголовка списка выделяется память из кодофайла: список можно освободить, но нельзя уничтожить. Работает исколючительно со строками. Динамически выделяет и освобождает для строк память.
\ GLOBAL-STRING-LIST:   \ ( " name" -> ) \ Создать глобальный строковый список, имя списка берется из входного потока. Для заголовка списка выделяется память из кодофайла: список можно освободить, но нельзя уничтожить. Список доступен для всех потоков. Работает исколючительно со строками. Динамически выделяет и освобождает для строк память.

\ При определении списка автоматически создаются следующие слова:
\ 'header VALUE имя_списка
\ : имя_списка[   LIST[ ;
\ : ]имя_списка   имя_списка ]LIST ;
\ : имя_списка#!   имя_списка LIST#! ;
\ : #!имя_списка   имя_списка #!LIST ;
\ : имя_списка@   имя_списка LIST@ ;
\ : имя_списка(   имя_списка LIST( ; IMMEDIATE
\ : )имя_списка   )LIST ; IMMEDIATE
\ : имя_списка!   имя_списка LIST! ;
\ : !имя_списка   имя_списка !LIST ;
\ : имя_списка?   имя_списка IN-LIST? ;

\ Слова для автоматического создания и уничтожения списков
\ LIST   \ ( -- list ) \ Создать список. Для заголовка списка выделяется память из хипа: такой список можно уничтожить. 
\ GLOBAL-LIST   \ ( -- list ) \ Создать глобальный список. Для заголовка списка выделяется память из глобального хипа: такой список можно уничтожить. Список доступен для всех потоков.

\ STRING-LIST   \ ( -- list ) \ Создать строковый список. Для заголовка списка выделяется память из хипа: такой список можно уничтожить. Работает исколючительно со строками. Динамически выделяет и освобождает для строк память.
\ GLOBAL-STRING-LIST   \ ( -- list ) \ Создать глобальный строковый список. Для нулевого элемента списка выделяется память из глобального хипа: такой список можно уничтожить. Список доступен для всех потоков. Работает исколючительно со строками. Динамически выделяет и освобождает для строк память.


\ Резултат в обоих случаях будет одинаковый:


Ещё хотел найти, но не нашёл слово, выдающее количество элементов (чисел или строк), находящихся сейчас в списке.

Как получить например 3 строчку из такого-то списка?
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Wed, 04 Jan 2012, 18:45

Вообще-то, это разные слова и никакого повторения нет - надо только прочитать более внимательно. Пример применения - создание деревьев.
Moriturus wrote:Ещё хотел найти, но не нашёл слово, выдающее количество элементов (чисел или строк), находящихся сейчас в списке.

Число элементов списка можно узнать только посчитав их:
Code: Select all
LIST: mylist
: mylist#   0 mylist( 1+ )mylist ;

Moriturus wrote:Как получить например 3 строчку из такого-то списка?

Code: Select all
: #mylist   
  0 mylist(
    2DUP =
    IF
      NODE LIST-EXIT
    ELSE
      1+
    THEN
  )mylist
  NIP NIP NSTR@
;
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 » Wed, 04 Jan 2012, 19:02

Ой, двоеточие не заметил, извиняюсь.

VoidVolker wrote:Число элементов списка можно узнать только посчитав их:

Спасибо, работает, может это в плагин?

VoidVolker wrote:: #mylist     0 mylist(    OVER =    IF      NODE LIST-EXIT    ELSE      1+    THEN  )mylist  NIP NSTR@;

а как им пользоваться?
2 #mylist TYPE CR ошибку выдаёт.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Wed, 04 Jan 2012, 19:55

Moriturus wrote:Спасибо, работает, может это в плагин?

Чуть позже добавлю, пока придется использовать то что есть.
Moriturus wrote:2 #mylist TYPE CR ошибку выдаёт.

Пардон, поправил.
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 » Thu, 05 Jan 2012, 19:51

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

Опять власть меняется

Postby Morituruz » Thu, 05 Jan 2012, 20:51

Спасибо, я вроде даже самостоятельно разобрался что менять надо у себя :)
По существу сказать нечего, вот про орфографию:
Описани:

\ Резултат в обоих случаях будет одинаковый:

И по-прежнему хочется увидеть примеры из реальной жизни. У вас конечно написано как пользоватсья, но это чистое программирование, а мы таки находимся на форуме nncron, задачи бы надо.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Thu, 05 Jan 2012, 21:41

Ап! Поправил. Вот как раз примеров из жизни на данный момент не так уж много. Ну вот например из соседней темы:
Code: Select all
#( Backup_Task
NoActive
STRING-LIST: Params
: BackupPath   \ ( -- a u ... an un )
  \ Путь 1
    " С:\programms"
    " F:\backaup"
  \ Путь 2
    " D:\documents"
    " \\server\docs"
  \ Путь 3
    " E:\work"
    " G:\work"
;
Params[ BackupPath ]Params
Action:
BEGIN Params@ NIP WHILE
  " BACKUP_LAUNCH_CMD %Params@>% %Params@>% " START-APPW
REPEAT
)#
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 » Thu, 05 Jan 2012, 21:59

Хорошо, вот есть отличный и вполне себе реальный пример из жизни - в нем как раз используются стандартные списки:
Code: Select all
#( Задача_939300110
WatchProc: "*"

VARIABLE WhiteList
VARIABLE BlackList

: >WhiteList WhiteList AddNode ;
: >BlackList BlackList AddNode ;

: InitWhiteList
  C" prog1.exe" >WhiteList
  C" prog2.exe" >WhiteList
  C" prog3.exe" >WhiteList
; InitWhiteList

: InitBlackList
  C" prog4.exe" >BlackList
  C" prog5.exe" >BlackList
  C" prog6.exe" >BlackList
; InitBlackList

: ProcInNode?
  NodeValue COUNT
  WATCH-PROC-ID PROC-NAME
  ICOMPARE 0=
;

: (InWhiteList)  \ ( node -- )
  ProcInNode?
    IF
      WATCH-PROC-ID PROC-NAME
      HIGH_PRIORITY_CLASS
      PRIORITY
    THEN
;

: (InBlackList)  \ ( node -- )
  ProcInNode?
    IF
      WATCH-PROC-ID PROC-NAME
      IDLE_PRIORITY_CLASS
      PRIORITY
    THEN
;

: CheckWhiteList   \ ( -- )
  ['] (InWhiteList) WhiteList DoList
;

: CheckBlackList   \ ( -- )
  ['] (InBlackList) BlackList DoList
;

Action:
CheckWhiteList
CheckBlackList
)#

А теперь то же самое, но с использованием плагина:
Code: Select all
#( Задача_225705012012
WatchProc: "*"
STRING-LIST: WhiteList
STRING-LIST: BlackList
WhiteList[ " prog1.exe" " prog2.exe" " prog3.exe" ]WhiteList
BlackList[ " prog4.exe" " prog5.exe" " prog6.exe" ]BlackList
Action:
WATCH-PROC-ID PROC-NAME 2DUP WhiteList?
  IF
    HIGH_PRIORITY_CLASS PRIORITY
  ELSE
    2DUP BlackList?
    IF
      IDLE_PRIORITY_CLASS PRIORITY
    ELSE 2DROP  THEN
  THEN
)#

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

Re: Плагин lists.spf

Postby SphinxST » Fri, 06 Jan 2012, 17:54

Ап! Поправил. Вот как раз примеров из жизни на данный момент не так уж много. Ну вот например из соседней темы:
Code: Select all
    #( Backup_Task
    NoActive
    STRING-LIST: Params
    : BackupPath   \ ( -- a u ... an un )
      \ Путь 1
        " С:\programms"
        " F:\backaup"
      \ Путь 2
        " D:\documents"
        " \\server\docs"
      \ Путь 3
        " E:\work"
        " G:\work"
    ;
    Params[ BackupPath ]Params
    Action:
    BEGIN Params@ NIP WHILE
      " BACKUP_LAUNCH_CMD %Params@% %Params@>% " START-APPW
    REPEAT
    )#


Похоже, %Params@>% неправильно отрабатывает. Пример выше выдает
Code: Select all
16:53:51 1204 SEMENT TASK: Backup_Task
16:53:51 1204 SEMENT Start: BACKUP_LAUNCH_CMD С:\programms С:\programms
16:53:51 1204 SEMENT Start result: 0
16:53:51 1204 SEMENT Start: BACKUP_LAUNCH_CMD F:\backaup F:\backaup
16:53:52 1204 SEMENT Start result: 0
16:53:52 1204 SEMENT Start: BACKUP_LAUNCH_CMD D:\documents D:\documents
16:53:52 1204 SEMENT Start result: 0
16:53:52 1204 SEMENT Start: BACKUP_LAUNCH_CMD \\server\docs \\server\docs
16:53:52 1204 SEMENT Start result: 0
16:53:52 1204 SEMENT Start: BACKUP_LAUNCH_CMD E:\work E:\work
16:53:52 1204 SEMENT Start result: 0
16:53:52 1204 SEMENT Start: BACKUP_LAUNCH_CMD G:\work G:\work
16:53:52 1204 SEMENT Start result: 0
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

Re: Плагин lists.spf

Postby VoidVolker » Fri, 06 Jan 2012, 20:10

SphinxST wrote:Похоже, %Params@>% неправильно отрабатывает. Пример выше выдает

Поправил. Просто надо было два Params@> использовать.
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 » Sun, 08 Jan 2012, 15:07

Ап! Мелкие исправления.
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 » Tue, 10 Jan 2012, 17:11

Заметил, что
Code: Select all
#( CLASSIC-TASK-#-mail_sound
NoActive
STRING-LIST: msounds
Action:
msounds LIST# 0=
IF
   " ...\*.wav" FOR-FILES
      FOUND-FULLPATH msounds!
   ;FOR-FILES
THEN
\ приглушаем звук на 30%
MIXER-VOLUME@ DUP 7 * 10 / MIXER-VOLUME!
\ случайный звук из списка:
PLAY-SOUNDW: "%msounds LIST# RANDOM msounds LIST#@%"
MIXER-VOLUME!
)#

срабатывает только первый раз (после обновления кронтаба, вызов из другой задачи через LAUNCH), во время второго выдаёт ошибку (видимо требует очистки). А вот если использовать GLOBAL-STRING-LIST:, то работает без ошибок.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Tue, 10 Jan 2012, 17:26

Moriturus wrote:Заметил, что
Code: Select all
#( CLASSIC-TASK-#-mail_sound
NoActive
STRING-LIST: msounds
Action:
msounds LIST# 0=
IF
   " ...\*.wav" FOR-FILES
      FOUND-FULLPATH msounds!
   ;FOR-FILES
THEN
\ приглушаем звук на 30%
MIXER-VOLUME@ DUP 7 * 10 / MIXER-VOLUME!
\ случайный звук из списка:
PLAY-SOUNDW: "%msounds LIST# RANDOM msounds LIST#@%"
MIXER-VOLUME!
)#

срабатывает только первый раз (после обновления кронтаба, вызов из другой задачи через LAUNCH), во время второго выдаёт ошибку (видимо требует очистки). А вот если использовать GLOBAL-STRING-LIST:, то работает без ошибок.

Все правильно, так и должно быть - локальная память одного потока недоступна другим потокам. Внимательнее надо читать описание:
VoidVolker wrote:...
списки с глобальным или локальным для потока выделением памяти
...
\ LIST: \ ( " name" -> ) \ Создать список, имя списка берется из входного потока. Для заголовка списка выделяется память из кодофайла: список можно освободить, но нельзя уничтожить.
\ GLOBAL-LIST: \ ( " name" -> ) \ Создать глобальный список, имя списка берется из входного потока. Для заголовка списка выделяется память из кодофайла: список можно освободить, но нельзя уничтожить. Список доступен для всех потоков.
\ STRING-LIST: \ ( " name" -> ) \ Создать строковый список, имя списка берется из входного потока. Для заголовка списка выделяется память из кодофайла: список можно освободить, но нельзя уничтожить.
\ GLOBAL-STRING-LIST: \ ( " name" -> ) \ Создать глобальный строковый список, имя списка берется из входного потока. Для заголовка списка выделяется память из кодофайла: список можно освободить, но нельзя уничтожить. Список доступен для всех потоков.
...
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 » Tue, 10 Jan 2012, 17:44

Вроде как LAUNCH запускает отдельным потоком, и этот список используется только в этой задаче.
Я просто поделился наблюдением. Мне это показалось неочевидным, что работает только один раз.
По хоткею вообще-то тоже не работает больше 1 раза, правда ошибок не выдаёт:
Code: Select all
#( CLASSIC-TASK-#-mail_sound
WatchHotKey: "^s"
\ NoActive

STRING-LIST: msounds
Action:
msounds LIST# 0=
IF
   " e:\System\My_Documents\Sounds\mail\*.wav" FOR-FILES
      FOUND-FULLPATH msounds!
   ;FOR-FILES
THEN
\ приглушаем звук на 30%
MIXER-VOLUME@ DUP 7 * 10 / MIXER-VOLUME!
\ случайный звук из списка:
PLAY-SOUNDW: "%msounds LIST# RANDOM msounds LIST#@%"
MIXER-VOLUME!
)#
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Tue, 10 Jan 2012, 18:06

Да, LAUNCH запускает задачу отдельным потоком с авторизацией, условиями и остальными опциями задачи. А вот RUN просто запускает раздел Action: в текущем потоке как слово. Это все описано в мануале.
Список после использования очищать обязательно. Дело в том, что после закрытия потока, память-то освобождается, а вот ссылки на неё остаются в заголовке списка. В результате могут возникнуть ошибки. Сейчас добавлю в описание.
Глобальные списки следует использовать в случае, если с ними нужно работать из нескольких задач. Тут появилась идея сделать локальные списки - для заголовка выделять память по USER.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot], Yahoo [Bot] and 3 guests

cron